2016-11-26 93 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) 
     } 
    } 
}