【发布时间】:2019-11-12 05:08:16
【问题描述】:
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 他们是通过委托保存的(检查上面的第一个代码):
protocol PassingProtocol {
func passRowSavedBack(_ valueSent: Bool)
}
- 使用
popViewController返回VC1(检查上面的第一个代码) - 在 VC1 中:
deselectRow在viewWillAppear中(检查上面的第二个代码) -
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()- 所以它会显示新的复选标记
【问题讨论】:
-
在
onClickSave操作中,“//保存更改,然后”部分是否有异步任务? -
你试过用 viewDidAppear(_ animated: Bool) 代替 viewWillAppear 吗??
-
@AhmadF 没有异步任务正在进行,没有(还没有来)。它在主线程上完成保存后立即调用开关。
-
@m1sh0 刚刚做了。使用“返回”按钮,动画现在稍后开始(因为它在视图实际加载之前不会开始)但是如果我使用“保存”按钮返回,它仍然不会显示。我也让它输出
mylastRowPickedIndex- 两者都是一样的。 -
事实上,我在我的项目上对其进行了测试,没关系,有一点不同,我只是存储行而不是 IndexPath。我不相信这是我认为可能在您的 onClickSave 函数中的问题。保存数据时是否有一些通知或触发重新加载表的东西?
标签: ios swift uitableview uinavigationcontroller