关闭表格视图控制器上方的模态显示视图控制器时,如何从表格视图控制器中取消选择行?

Posted

技术标签:

【中文标题】关闭表格视图控制器上方的模态显示视图控制器时,如何从表格视图控制器中取消选择行?【英文标题】:How can I deselect rows from a table view controller when dismissing a modally presented view controller above it? 【发布时间】:2020-12-26 19:48:42 【问题描述】:

我有一个表视图控制器 (A),它以模态方式呈现一个导航控制器,另一个表视图控制器 (B) 作为其根视图。当从 A 点按单元格时会显示 B,但在通过向下滑动将 B 关闭时单元格仍保持选中状态。

我一直在尝试从 B 访问 A 而不是尝试使用委托,因为当用户决定向下滑动以关闭 B 而不是使用取消按钮时,设置所有这些只是为了取消选择某些行似乎有点过分调用 unwind segue 取消选择行。

我尝试在 A 中取消选择 viewWillAppear()viewDidAppear() 中的行,但这似乎不起作用。

我已经在 B 中实现了 presentationControllerDidDismiss(presentationController:) 函数,所以当 B 被正确关闭时,我可以调用 A 来取消选择行,但是我无法访问 A。

我尝试手动添加和调用与取消按钮调用相同的 segue,以重用相同的取消选择实现

class TableViewControllerB: UITableViewController, UIAdaptivePresentationControllerDelegate 
    // ...
    
    func presentationControllerDidDismiss(_ presentationController: UIPresentationController) 
        self.performSegue(withIdentifier: "cancelUnwind", sender: self)
    


我也尝试过通过presentingViewController 访问 A,但由于某种原因,即使 B 是通过 A 模态呈现的,它也是 nil。

我不确定当 B 被滑动解除时如何访问 A 或让它取消选择其行。任何想法将不胜感激。

【问题讨论】:

【参考方案1】:

您可以在模态显示之前将 tableView 作为可选变量从 A 传递到 B。

类 tableViewControllerB var tableViewA:UiTableView?

当您在 A 中实例化控制器 B 时,设置此变量然后呈现控制器。当它被解雇时,使用 indexPathForSelectedRow https://developer.apple.com/documentation/uikit/uitableview/1615000-indexpathforselectedrow

取消选择单元格。

【讨论】:

【参考方案2】:

didSelectRowAt 中,您可以在表视图中调用:

yourTableView.deselectRow(at: indexPath as IndexPath, animated: true)

这将在您按下后取消选择该行!

【讨论】:

以上是关于关闭表格视图控制器上方的模态显示视图控制器时,如何从表格视图控制器中取消选择行?的主要内容,如果未能解决你的问题,请参考以下文章

呈现/关闭包含表格的模态视图控制器会使表格下降

模态显示的表格视图没有导航栏

关闭两个模态(表格)视图控制器

如何通知父视图控制器模态视图控制器中更改的屏幕方向?

在 Swift 中显示和关闭模态视图控制器

旋转设备时表格视图更新无效