"deselectRow" 如果使用 "popViewController" 则不会设置动画

"deselectRow" doesn't animate if using "popViewController"

Swift5,Xcode10

我的应用使用两个 ViewControllers:

  1. VC1,UITableView,点击一个单元格调用
  2. VC2,显示有关单元格的更多信息,默认 UINavigationBarItem "back" 按钮位于左上角,添加 "save" 按钮位于底部

"save" 按钮保存所做的更改。要返回 VC2,您可以单击 "back" 按钮或保存更改,这也会自动加载 VC2 使用:

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

如果我使用 UINavigationBarItem "back" 按钮返回,单元格也会保持其选择颜色一秒钟,然后将其删除(就像在 iOS "Contacts" 应用程序)使用这个:

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

示例 gif.

问题是:如果我用 "Save" 按钮返回,也会调用此代码,但没有动画。

我的猜测是 popViewController 返回所需的时间比 "back" 按钮调用的任何内容都长,因此动画已播放但您没有 "arrive" 及时看到它.

但是我该如何解决这个问题?是否有其他方法可以通过 "Save" 按钮返回到 VC1(不删除默认的 "back" 按钮!)仍然播放动画?

编辑:我在做什么:

  1. 在 VC2 中:保存更改
  2. 告诉 VC1 它们是用委托保存的(检查上面的第一个代码):
protocol PassingProtocol {
    func passRowSavedBack(_ valueSent: Bool)
}
  1. 使用 popViewController 返回 VC1(检查上面的第一个代码)
  2. 在 VC1 中:deselectRowviewWillAppear 中(检查上面的第二个代码)
  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() - 所以它显示新的复选标记

好吧,我终于明白问题出在哪里了。

您正在调用 myTableView.reloadData(),这是取消选择动画的问题。

您可以在 viewDidAppear() 中移动 myTableView.reloadData(),一切都会好起来的。