moveRowAtIndexPath не обновляет содержимое ячейки - PullRequest
8 голосов
/ 22 октября 2011

iOS 5 наконец-то добавил moveRowAtIndexPath:toIndexPath: метод к UITableView. Проблема в том, что его вызов только перемещает строку, но не обновляет и не перерисовывает. Единственный способ сделать это - найти ячейку и напрямую вызвать setNeedsDisplay. Но это сложно, так как вы никогда не знаете, переместилась ли уже клетка или нет.

Я также не могу вызвать reloadRowsAtIndexPaths:, поскольку мне не разрешено применять 2 анимации к одной строке внутри одного и того же блока beginUpdates-endUpdates.

Я могу придумать несколько обходных путей, например разделить все это на 2 блока анимации. Но мне интересно, что я что-то упускаю, так как все поведение мне кажется странным.

Ответы [ 2 ]

14 голосов
/ 10 марта 2012

Наконец-то получил официальный ответ от Apple по этому вопросу:

Инженерные службы определили, что эта проблема ведет себя так, как и предполагалось, на основе следующей информации:

Только вставка и обновление вызывают толькоячейка, запрашиваемая у источника данных (первая, потому что она новая, а вторая, потому что вы явно указали представлению таблицы обновить ячейку).Удаление и перемещение не обновляют содержимое, поскольку оно не подразумевается в выполняемом действии.Если вам нужно изменить содержимое ячейки во время обновления, просто зайдите в ячейку и измените содержимое.

2 голосов
/ 26 апреля 2015

Им нравится, что нам трудно, не так ли; -)

    case NSFetchedResultsChangeUpdate:
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

    case NSFetchedResultsChangeMove:
        // old API
        //[tableView  deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
        //[tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];

        // new API
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:newIndexPath]; // note use of newIndexPath
        [tableView moveRowAtIndexPath:indexPath toIndexPath:newIndexPath]; // NS_AVAILABLE_IOS(5_0);
        break;

Обратите внимание, что в ChangeMove configureCell имеет другие параметры по сравнению с его использованием в ChangeUpdate, поэтому будьте осторожны при вставке копии. Довольно сложно понять это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...