2016-11-26 139 views
0

在像设置应用程序,当UISplitViewContoller处于折叠状态,该UITableView细胞显示标准“>”公开附件图标的应用程序:更新表格单元格附件

Settings app in portrait orientation

在旋转为横向时和全UISplitViewController变得可见,如加上大小的iPhone设备,披露图标消失:

Settings app in landscape

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

我考虑的最简单的解决方案是在视图控制器的viewWillTransitionToSize方法中调用self.tableView.reloadData(),但这看起来像是一种非常“蛮力”的方式。

有没有人做过这种实现?你是如何解决它的?

+1

没有用它自己,但它听起来像一个[UISplitViewControllerDelegate(HTTPS作业://开发商.apple.com /参考/ UIKit的/ uisplitviewcontrollerdelegate)。 – pbasdf

+0

理想情况是,但我已经有了一个父视图控制器,我已经在使用'委托'(管理所有当前可见的视图控制器的状态)。我希望在当前的视图控制器级别上有另一种方式接收转换通知。我只是看着'UIViewController'上的' - (void)collapseSecondaryViewController:(UIViewController *)secondaryViewController forSplitViewController:(UISplitViewController *)splitViewController'方法,但这似乎并没有被调用。 – TiM

回答

0

啊哈!我发现了如何去做! 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) 
     } 
    } 
}