如果使用“ popViewController”,则“ deselectRow”不会动画

时间:2019-07-01 14:25:22

标签: ios swift uitableview uinavigationcontroller

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. 使用popViewController返回VC1(检查上面的第1个代码)
  2. 在VC1中:deselectRow中的viewWillAppear(请检查上面的第二个代码)
  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 个答案:

答案 0 :(得分:1)

好的,最后我想我明白了问题所在。

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

您可以在viewDidAppear()中移动myTableView.reloadData(),一切正常。