2016-11-26 3 views
0

В приложениях, как приложение настройки, когда UISplitViewContoller свернут, то UITableView клетки отображать стандартные «>» раскрытия информации аксессуар иконки:Обновление ячейки таблицы Аксессуар при Split View Controller Обвалы/Расширяет

Settings app in portrait orientation

На устройства, такие как Plus размера айфоны при повороте на альбомный и полный UISplitViewController становится видимым, значки раскрытия информации исчезают:

Settings app in landscape

При первоначальной настройке ячеек можно просто вызвать self.splitViewController.isCollapsed, чтобы узнать, что представляет собой текущее состояние контроллера разделенного вида. Однако, когда переход происходит после этой точки, я не уверен, что лучший способ получить уведомления об этом случае.

Самое простое решение, которое я рассмотрел, - это просто позвонить self.tableView.reloadData() внутри метода управления viewWillTransitionToSize контроллера вида, но это похоже на действительно «грубую силу».

Кто-нибудь сделал такую ​​реализацию? Как вы его решили?

+1

не использовал его сам, но это звучит как работа для [UISplitViewControllerDelegate] (https: // разработчик .apple.com/ссылка/UIKit/uisplitviewcontrollerdelegate). – pbasdf

+0

В идеале да, но у меня есть контроллер родительского представления, где я уже использую 'delegate' (для управления состоянием всех видимых в настоящее время контроллеров представлений). Я надеялся, что будет еще один способ получать уведомления о переходах только на уровне текущего контроллера. Я просто смотрел на '- (void) collapseSecondaryViewController: (UIViewController *) secondaryViewController forSplitViewController: (UISplitViewController *) метод splitViewController' на' UIViewController', но, похоже, его вообще не называют. – TiM

ответ

0

Aha! Я обнаружил, как это сделать! Apple iOS 8 sample code on size classes демонстрирует, как это сделать.

Я создавал свои экземпляры UITableViewCell только в методе источника данных cellForRowAtIndexPath, который, конечно же, вызывается только один раз для создания каждой ячейки.

компании Apple пример кода настраивает вид аксессуар ячейки таблицы в методе willDisplayCell делегата и этот метод, кажется, называется на каждой видимой ячейки автоматически, когда происходит переход UISplitViewController. :)

Редактировать: Хорошо, при дальнейших исследованиях выясняется, что это не автоматическое. Это NSNotification.

Вот код из приложения Apple Sample. В контроллере представления 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) 
     } 
    } 
} 
Смежные вопросы