拆分视图控制器折叠/展开时更新表格单元格附件
Posted
技术标签:
【中文标题】拆分视图控制器折叠/展开时更新表格单元格附件【英文标题】:Updating Table Cell Accessory when Split View Controller Collapses/Expands 【发布时间】:2016-11-26 23:06:46 【问题描述】:在设置应用等应用中,当UISplitViewContoller
折叠时,UITableView
单元格会显示标准的“>”披露附件图标:
在大尺寸 iPhone 等设备上,当旋转到横向并且完整的 UISplitViewController
变得可见时,披露图标会消失:
最初配置单元格时,可以简单地调用self.splitViewController.isCollapsed
来了解拆分视图控制器的当前状态。但是,当在那之后发生转换时,我不确定接收该事件通知的最佳方式是什么。
我考虑过的最简单的解决方案是在视图控制器的 viewWillTransitionToSize
方法中调用 self.tableView.reloadData()
,但这似乎是一种真正“蛮力”的做法。
有人做过这种实现吗?你是怎么解决的?
【问题讨论】:
我自己没用过,但听起来像是UISplitViewControllerDelegate 的工作。 理想情况下是的,但我有一个父视图控制器,我已经在使用delegate
(管理所有当前可见视图控制器的状态)。我希望有另一种方法可以仅在当前视图控制器的级别上接收转换通知。我只是在看UIViewController
上的- (void)collapseSecondaryViewController:(UIViewController *)secondaryViewController forSplitViewController:(UISplitViewController *)splitViewController
方法,但这似乎根本没有被调用。
【参考方案1】:
啊哈!我发现了怎么做! Apple ios 8 sample code on size classes 演示了如何做到这一点。
我只在cellForRowAtIndexPath
数据源方法中设置我的UITableViewCell
实例,当然,每个单元格的创建只调用一次。
Apple 的示例代码在willDisplayCell
委托方法中配置表格单元格附件视图,并且当UISplitViewController
转换发生时,此方法似乎会在每个可见单元格上自动调用。 :)
编辑:好的,在进一步探索中,事实证明这不是自动的。这是一个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)
【讨论】:
以上是关于拆分视图控制器折叠/展开时更新表格单元格附件的主要内容,如果未能解决你的问题,请参考以下文章