在拆分视图控制器 Collapses/Expands 时更新 Table 单元格附件

Updating Table Cell Accessory when Split View Controller Collapses/Expands

在“设置”应用等应用中,当 UISplitViewContoller 折叠时,UITableView 单元格会显示标准的“>”披露附件图标:

在像大号 iPhone 这样的设备上,当旋转到横向并且整个 UISplitViewController 变得可见时,公开图标消失:

最初配置单元格时,可以简单地调用 self.splitViewController.isCollapsed 来了解拆分视图控制器的当前状态。但是,当在该点之后发生转换时,我不确定接收该事件通知的最佳方式是什么。

我考虑过的最简单的解决方案是在视图控制器的 viewWillTransitionToSize 方法中调用 self.tableView.reloadData(),但这似乎是一种真正的 'brute-force' 方法。

有人做过这种实现吗?你是怎么解决的?

啊哈!我发现了怎么做! Apple iOS 8 sample code on size classes 演示了如何操作。

我只在 cellForRowAtIndexPath 数据源方法中设置我的 UITableViewCell 实例,当然,每个单元格的创建只调用一次。

Apple 的示例代码在 willDisplayCell 委托方法中配置 table 单元格附件视图,并且 当一个 [=15] =] 转换发生。 :)

编辑: 好吧,经过进一步探索,事实证明它不是自动的。这是一个 NSNotification

这是来自 Apple 示例应用程序的代码。在视图控制器的 viewDidLoad:

override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(ListTableViewController.showDetailTargetDidChange(_:)), name: NSNotification.Name.UIViewControllerShowDetailTargetDidChange, object: nil)
}

以及通知触发的方法:

func showDetailTargetDidChange(_ notification: Notification) {
    /*
        Whenever the target for showDetailViewController: changes, update all
        of our cells (to ensure they have the right accessory type).
    */
    for cell in tableView.visibleCells {
        if let indexPath = tableView.indexPath(for: cell) {
            tableView(tableView, willDisplay: cell, forRowAt: indexPath)
        }
    }
}