2015-09-29 4 views
0

Я работаю на универсальное приложение с последней инстанции UISplitViewController (пост iOS8, работает как на iPhone и IPad)Какова наилучшая практика обновления типов аксессуаров в UISplitViewController?

компании Apple рекорды практики говорит, что на простом табличном, открывая новые детали просмотра, вы должны показать индикатор раскрытия НО, но когда ваше расщепление отображается на iPad, вы не должны показывать аксессуар к табурету мастера.

Так я придумал этот код в моей cellForRowAtIndexPath функции:

cell.accessoryType = self.splitViewController!.collapsed ? .DisclosureIndicator : .None; 

Это хорошо работает, но через некоторое время, изменения splitviewcontroller, например, на iPhone 6 плюс, при повороте устройства или на iPad, когда вы используете многозадачную функцию с разделенным экраном, представление таблицы мастеров должно скрывать или снова показывать вид аксессуара (и он делает это для новых загруженных ячеек, как это должно быть), но мне нужно будет перезагрузить весь tableview.

На данный момент я не нашел функцию, которая запускает после того, как вид изменил его макет, чтобы вызвать мой tableview.reloadData().

Может ли кто-нибудь сказать мне, что это лучшая практика для перезагрузки моего стола и убедитесь, что аксессуар изменился так же, как и для всех ячеек, когда меня изменяет макет раскладки?

ответ

1

Вы можете обнаружить, что разделенное представление сворачивается или разбивается путем реализации методов делегирования разделенного представления в классе контроллера разделенного представления. Требуется создать пользовательский класс для контроллера разделенного вида. Не уверен, что это вам очень понравится, потому что делегаты, вероятно, будут вызваны до того, как произойдет разделение, поэтому вы не сможете запустить загрузку таблицы в этот момент, так как он подберет существующий раскол, а не раскол.

Лучше всего было бы обнаружить, что ориентация изменилась, зарегистрировавшись для уведомления. Хорошая вещь с уведомлением заключается в том, что она отправляется после того, как произошло вращение, поэтому установлена ​​новая ориентация. Затем просто перезагрузите, и ваш существующий код создания ячейки сделает все остальное.

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Add notification of orientation change 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "controllerRotated", name: UIDeviceOrientationDidChangeNotification, object: nil) 
} 

func controllerRotated(){ 
    if(UIDeviceOrientationIsLandscape(UIDevice.currentDevice().orientation)){ 
    NSLog("Landscape") 
    } 
    else{ 
    NSLog("Portrait") 
    } 

    self.tableView.reloadData()   
} 
+0

Thats nice, он работает для изменения ориентации, но он не будет работать для iPad, когда я использую многозадачное разделенное приложение на iPad. Он возвращается на макет iPhone, а UIDeviceOrientationDidChangeNotification не вызывается при запуске интерфейса многозадачности на iPad. Я буду искать уведомление об изменении макета в яблочных документах, но мне нравится, как вы это делаете! – Dean

+0

Я также добавил экземпляр 'viewWillTransitionToSize'. Так или иначе, он не работал сам по себе, но бок о бок с вашим решением я охватываю все свои варианты использования! – Dean

+1

@Dean Проблема, которую я обнаружил при изменении размера, заключалась в том, что это вызвано до того, как произойдет переход. Однако похоже, что этот метод передает вам UIViewControllerTransitionCoordinator, в который вы можете зарегистрировать блок для выполнения при завершении перехода. Я бы попытался вызвать перезагрузку из этого блока. https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIViewControllerTransitionCoordinator_Protocol/index.html#//apple_ref/occ/intfm/UIViewControllerTransitionCoordinator/notifyWhenInteractionEndsUsingBlock: –

Смежные вопросы