Какие методы я должен реализовать для перестраивания строк UITableView?

Если вы хотите, чтобы Служба выполняла фоновые задачи (аналогично старым Службам Windows), я предлагаю вам использовать: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/ host / generic-host? view = aspnetcore-2.2 вместо WebHost.

WebHost добавляет много вещей, которые, вероятно, вам не понадобятся, поскольку кажется простой фоновой работой (при условии, что вы читаете ваш код).

6
задан Ryan Townshend 28 January 2009 в 02:37
поделиться

4 ответа

Здесь мы делаем наш тяжелый подъем.

 - (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;
}
14
ответ дан 8 December 2019 в 03:11
поделиться

NSMutableArray назвали метод exchangeObjectAtIndex:withObjectAtIndex:.

0
ответ дан 8 December 2019 в 03:11
поделиться

Ни один из выше будет работать. В исходном опубликованном коде 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, поэтому знаю, что, вероятно, есть более простой способ сделать это, или код, вероятно, можно упростить ... Просто пытаюсь помочь, где могу, потому что мне потребовалось несколько часов, чтобы понять это вне. Надеюсь, это кому-то сэкономит время!

11
ответ дан 8 December 2019 в 03:11
поделиться

Согласно документации Apple и моему собственному опыту, это простой код это работает достаточно хорошо:

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];
[tempObj release];
5
ответ дан 8 December 2019 в 03:11
поделиться