Если вы хотите, чтобы Служба выполняла фоновые задачи (аналогично старым Службам Windows), я предлагаю вам использовать: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/ host / generic-host? view = aspnetcore-2.2 вместо WebHost.
WebHost добавляет много вещей, которые, вероятно, вам не понадобятся, поскольку кажется простой фоновой работой (при условии, что вы читаете ваш код).
Здесь мы делаем наш тяжелый подъем.
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
toIndexPath:(NSIndexPath *)toIndexPath
{
NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row);
// fetch the object at the row being moved
NSString *r = [rows objectAtIndex:fromIndexPath.row];
// remove the original from the data structure
[rows removeObjectAtIndex:fromIndexPath.row];
// insert the object at the target row
[rows insertObject:r atIndex:toIndexPath.row];
NSLog(@"result of move :\n%@", [self rows]);
}
Так как это - основной пример, позволяет, делают все строки подвижными.
- (BOOL)tableView:(UITableView *)tableView
canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
NSMutableArray
назвали метод exchangeObjectAtIndex:withObjectAtIndex:
.
Ни один из выше будет работать. В исходном опубликованном коде tableview выйдет из строя, потому что он удалит данные, которые все еще будут использоваться, и даже после того, как это было исправлено, в массиве не будет правильных данных из-за способа, которым таблица выполняет «переупорядочение».
exchangeObjectAtIndex: withObjectAtIndex: не будет работать для переупорядочения массива в соответствии с тем, как табличное представление реализует собственное переупорядочение
Почему? Потому что, когда пользователь выбирает ячейку таблицы для ее перестановки, эта ячейка НЕ заменяется ячейкой, в которую они ее перемещают. Выбранная ими ячейка вставляется в новый индекс строки, а затем исходная ячейка удаляется. По крайней мере, так это кажется пользователю.
Решение: Из-за того, как tableview реализует перестановку, нам нужно выполнить проверку, чтобы убедиться, что мы добавляем и удаляем правильную строку. Этот код, который я собрал, прост и идеально подходит для меня.
Использование исходных опубликованных данных кода в качестве примера:
- (void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath
toIndexPath:(NSIndexPath *)toIndexPath
{
NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row);
// fetch the object at the row being moved
NSString *r = [rows objectAtIndex:fromIndexPath.row];
// checks to make sure we add and remove the right rows
if (fromIndexPath.row > toIndexPath.row) {
// insert the object at the target row
[rows insertObject:r atIndex:toIndexPath.row];
// remove the original from the data structure
[rows removeObjectAtIndex:(fromIndexPath.row + 1)];
}
else if (fromIndexPath.row < toIndexPath.row) {
// insert the object at the target row
[rows insertObject:r atIndex:(toIndexPath.row + 1)];
// remove the original from the data structure
[rows removeObjectAtIndex:(fromIndexPath.row)];
}
}
Если вы уделите немного времени и посмотрите, что происходит с табличным представлением во время переупорядочения, вы поймете, почему мы добавляем единицы там, где мы это сделали.
Я новичок в xcode, поэтому знаю, что, вероятно, есть более простой способ сделать это, или код, вероятно, можно упростить ... Просто пытаюсь помочь, где могу, потому что мне потребовалось несколько часов, чтобы понять это вне. Надеюсь, это кому-то сэкономит время!
Согласно документации Apple и моему собственному опыту, это простой код это работает достаточно хорошо:
NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];
[tempObj release];