"deselectRow" 如果使用 "popViewController" 则不会设置动画
"deselectRow" doesn't animate if using "popViewController"
Swift5,Xcode10
我的应用使用两个 ViewControllers
:
- VC1,
UITableView
,点击一个单元格调用
- 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" 按钮!)仍然播放动画?
编辑:我在做什么:
- 在 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()
- 所以它显示新的复选标记
好吧,我终于明白问题出在哪里了。
您正在调用 myTableView.reloadData()
,这是取消选择动画的问题。
您可以在 viewDidAppear() 中移动 myTableView.reloadData()
,一切都会好起来的。
Swift5,Xcode10
我的应用使用两个 ViewControllers
:
- VC1,
UITableView
,点击一个单元格调用 - 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" 按钮!)仍然播放动画?
编辑:我在做什么:
- 在 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()
- 所以它显示新的复选标记
好吧,我终于明白问题出在哪里了。
您正在调用 myTableView.reloadData()
,这是取消选择动画的问题。
您可以在 viewDidAppear() 中移动 myTableView.reloadData()
,一切都会好起来的。