2016-01-23 1 views
0

У меня есть универсальное приложение, которое использует два разных контроллера UISplitview для управления двумя различными наборами данных Master/Detail (один тип данных вложен в Другие).Force UISplitViewController (который программно сделан rootViewController), чтобы начать с главного представления на iPhone в Swift

я перейти от первого в другую, вызывая следующую функцию:

@IBAction func viewEntries(sender: AnyObject) { 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let entriesSplitView = storyboard.instantiateViewControllerWithIdentifier("entriesSplitView") as! UISplitViewController 
    entriesSplitView.delegate = self.appDelegate 
    UIView.transitionWithView(self.view.window!, duration: 0.25, options: .TransitionCrossDissolve, animations: 
     { 
      self.appDelegate.window?.rootViewController = entriesSplitView 

     }, completion: nil) 

} 

В контроллере мастер просмотра этого вторичного UISplitView, я установил leftBarButton в навигационный контроллер, чтобы вызвать аналогичную функцию для возврата к оригинальный, самый верхний уровень UISplitView.

Моя единственная проблема заключается в том, что я хочу убедиться, что на iPhone первое представление, появившееся после этого перехода, является контроллером подробных представлений, но сначала мне нужен главный ViewController, а затем, чтобы иметь возможность просматривать подробности после этого. Я могу решить, что, добавив:

 let masterNavigationController = entriesSplitView.viewControllers[0] as! UINavigationController 
     masterNavigationController.popToRootViewControllerAnimated(false) 

после self.appDelegate.window?.rootViewController = entriesSplitView, но когда я делаю, есть быстрое мерцание. Если я поставлю его перед этим вызовом, он не будет иметь желаемого эффекта.

Любые идеи относительно правильного способа убедиться, что главный вид называется первым, а также разрешает доступ к подробному представлению?

+0

Почему бы не настроить rootViewController на masterNavigationController? – azimov

+0

Я пробовал это, но это не сработало. То, как оно было обернуто в режиме разделения, находится совсем не так ... контроллер представления деталей не имеет элементов навигационного контроллера, к которому он предназначен, и способ, которым вид мастера подходит, не соответствует действительности. Btw, моя настройка в IB для вторичного uispkitviewcontroller и его дочерних элементов идентична шаблону apple/apple. –

ответ

0

Я думаю, что UISplitViewControllerDelegate - ваш друг здесь.

Сделайте свой контроллер представления корневой делегат для контроллера Разделить:

self.splitViewController?.delegate = self 

А затем реализовать следующий метод:

extension MyViewController : UISplitViewControllerDelegate { 
    func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { 
     return true 
    } 
} 

Это заставит контроллер Разделить, чтобы отобразить мастер по по умолчанию в горизонтально компактных средах. Для создания желаемого эффекта для вашего приложения может потребоваться настраиваемая логика в теле функции, но это место для этого.

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