Swift 5, Xcode 10
Мое приложение использует два ViewControllers
:
- VC1,
UITableView
, нажатие на ячейку вызывает
- 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 через кнопку «Сохранить» (без удаления кнопки «Назад» по умолчанию!), Которая по-прежнему воспроизводит анимацию?
Редактировать: Что я делаю точно:
- В VC2: сохранить изменения
- Скажите VC1, что они были сохранены с делегатом (проверьте 1-й код выше):
protocol PassingProtocol {
func passRowSavedBack(_ valueSent: Bool)
}
- Вернитесь к VC1, используя
popViewController
(проверьте 1-й код выше)
- В VC1:
deselectRow
в viewWillAppear
(см. 2-й код выше)
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
}
myTableView.reloadData()
- поэтому отображается новая галочка