"deselectRow" не анимируется, если используется "popViewController" - PullRequest
0 голосов
/ 01 июля 2019

Swift 5, Xcode 10

Мое приложение использует два ViewControllers:

  1. VC1, UITableView, нажатие на ячейку вызывает
  2. VC2, отображает дополнительную информацию о ячейке со стандартной UINavigationBarItem кнопкой «назад» вверху слева и дополнительной кнопкой «сохранить» внизу

Кнопки «Сохранить» сохраняют сделанные изменения. Чтобы вернуться к VC2, вы можете либо нажать кнопку «Назад», либо сохранить изменения, которые также автоматически загружают VC2, используя:

@IBAction func onClickSave(_ sender: Any) {
    //Save changes
    delegate?.passRowSavedBack(true) //Tell VC1 that changes were saved
    navigationController?.popViewController(animated: true)
}

Если я вернусь с помощью UINavigationBarItem кнопки «назад», ячейка также сохранит свой цвет выделения на секунду, а затем удалит его (как в приложении «Контакты» на iOS), используя это:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    myTableView.deselectRow(at: mylastRowPickedIndex!, animated: true)
}

Пример gif .

Проблема в том, что: если я вернусь с кнопкой «Сохранить», этот код также будет вызван, но анимация отсутствует.

Я предполагаю, что popViewController занимает больше времени, чтобы вернуться назад, чем бы ни вызывала кнопка «назад», поэтому анимация воспроизводится, но вы не «вовремя» приходите, чтобы ее увидеть.

Но как мне это исправить? Есть ли другой способ вернуться к VC1 через кнопку «Сохранить» (без удаления кнопки «Назад» по умолчанию!), Которая по-прежнему воспроизводит анимацию?

Редактировать: Что я делаю точно:

  1. В VC2: сохранить изменения
  2. Скажите VC1, что они были сохранены с делегатом (проверьте 1-й код выше):
protocol PassingProtocol {
    func passRowSavedBack(_ valueSent: Bool)
}
  1. Вернитесь к VC1, используя popViewController (проверьте 1-й код выше)
  2. В VC1: deselectRow в viewWillAppear (см. 2-й код выше)
  3. rowsSaved[lastRowPicked] = true, поэтому здесь можно добавить accessoryType:
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell
    cell.accessoryType = (rowsSaved[indexPath.row]==true) ? .checkmark : .none
    return cell
}
  1. myTableView.reloadData() - поэтому отображается новая галочка

1 Ответ

1 голос
/ 02 июля 2019

Хорошо, наконец-то, я думаю, что понимаю, в чем проблема.

Вы звоните myTableView.reloadData(), и это проблема отмены выбора анимации.

Вы можете переместить myTableView.reloadData() в viewDidAppear (), и все будет хорошо.

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