Как перезагрузить просмотр таблицы после изменения порядка строк? Ряды имеют переменную высоту

Я разрешаю пользователю переупорядочивать строки в tableView. Поскольку это событие влияет на содержимое (некоторые числовые значения в ячейках должны быть обновлены), во всех остальных строках я вызываю reloadData в moveRowAtIndexPath. И тогда происходят странные эффекты.

т.е. ячейки кажутся перекрывающимися при прикосновении к драгеру, и некоторые ячейки начинают двигаться вверх и вниз. Важно знать, что высота клеток различна.

Странно, что если я удалю reloadData из moveRowAtIndexPath, тогда все эти явления исчезнут. Только содержание недействительно.

Так как мне перезагрузить данные после переупорядочения?


ОБНОВЛЕНИЕ: что я сделал тем временем, переконфигурируя ячейки в viewDidLayoutSubviews вместо вызова reloadData конец moveRowAtIndexPath. И он работает на 90%, как я ожидаю, но все же строки иногда несколько выше, чем должны.

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

    //..

    reorderOccured = true
}

override func viewDidLayoutSubviews() {

    if reorderOccured {

        for cell in tableView.visibleCells() as! [UITableViewCell] {

            let ip = tableView.indexPathForCell(cell)
            if ip != nil {
                self.configureCell(cell, indexPath: ip!)
            }
        }

        reorderOccured = false
    }
}
7 голосов | спросил János 9 J0000006Europe/Moscow 2015, 18:13:29

3 ответа


0

Я нашел здесь ответ: https://stackoverflow.com/a/4692563/239219

[tableView beginUpdates];
[tableView endUpdates];

Этот код заставляет UITableView перезагружать только размеры ячеек, но не содержимое ячеек.

ответил János 18 J0000006Europe/Moscow 2015, 13:50:50
0

Вы не должны вызывать reloadData после повторного заказа. Вы должны внести те же изменения в свои данные, что и изменения, внесенные на экране. Например: если вы переместили ячейку № 2 в позицию 6, вы должны удалить свой объект, который заполняет ячейку № 2, и снова вставить его в позицию 6. Вы не предоставили достаточно информации, но обычно вы храните свои данные в массиве объектов. Этот массив, в который вы должны внести изменения, поэтому ваш резервный источник данных действителен.

Вот ссылка на подробности от Apple.

Я только что прочитал обновленную версию после публикации своего ответа. Похоже, вам действительно нужно reloadData. В этом случае я советую перезагрузить компьютер после небольшой задержки с блоком dispatch_async в главном потоке. Скажи после 0.1.

ответил pteofil 17 J0000006Europe/Moscow 2015, 19:59:15
0

Я пока не могу комментировать ответ pteofil, но он прав: если у вас есть пронумерованный набор строк в таблице и вы переместили один вызов moveRow (...), ваша анимация для перемещения будет отменена с помощью tableView.reloadData ().

Таким образом, я отложил перезагрузку данных (которая перенумеровывает все видимые ячейки на основе обновленного источника данных (не забывайте делать это, когда вы перемещаете вещи!)) на пару сотен миллисекунд, и теперь она отлично работает и выглядит тоже отлично.

ответил the_dude_abides 3 42016vEurope/Moscow11bEurope/MoscowThu, 03 Nov 2016 01:09:51 +0300 2016, 01:09:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132