2016-04-25 4 views
3

У меня есть UISplitViewController, у которого есть preferredDisplayMode = .AllVisible. Here - это то, как я настроил свою раскадровку, заметьте, как контроллер детализации уже встроен в UINavigationController.Как обеспечить, чтобы мой контроллер детального просмотра всегда был встроен в UINavigationController?

я выполнить следующий метод, когда определенная кнопка сливают в toolBar от Master View Controller:

@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {  
     self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender) 
} 

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

Итак я пытаюсь следующий вместо:

@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {  
     self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("NavigationSearchViewController") as! NavigationSearchViewController, sender: sender) 
} 

Теперь я заменить мою Detail View Controller с тем же ВК, как и раньше, но вместо того, чтобы вложить в UINavigationController. Поведение работает, как и ожидалось, в режиме 6+ в ландшафтном режиме, так как в нем отображается navigationBar.

Но в портретном режиме я вижу сбойное поведение, потому что теперь, когда новый VC помещается в стек, я вижу, как toolBar исчезают на исходном контроллере подробных представлений, вызывая странный переход, где явно ничего не происходит ,

Как правильно использовать showDetailViewController(..), чтобы у меня всегда был мой контроллер детального просмотра, встроенный в UINavigationController, но без каких-либо нечетных переходов? Я думаю, это требует от меня изменения делегатов UISplitViewController, но я продолжаю получать «Can not push UINavigationController для стека». ошибка.

Edit: Единственный делегат я изменил:

func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool { 
     //Since splitViewController!.showViewController changes secondaryViewController to no longer be a UINavigationController, this must first be checked for there to even be a BlankVC. 
     if let secondaryNavController = secondaryViewController as? UINavigationController { 
      if ((secondaryNavController.topViewController) != nil) { 
        return true 
      } 
      return false 
    } 

В настоящее время я вижу такое же поведение.

ответ

0

Да, реализуйте делегат:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.splitViewController.delegate = self; 
    ... 
} 

#pragma mark - UISplitViewControllerDelegate 

/* On iPhone 6 Plus: 
     Portrait: This method is called and YES is returned. 
     Landscape: This method is not called. 
    On iPad Air 
     Portrait: This method is not called. 
     Landscape: This method is not called. 
*/ 

- (BOOL)  splitViewController:(UISplitViewController *)splitViewController 
    collapseSecondaryViewController:(UIViewController *)secondaryViewController 
      ontoPrimaryViewController:(UIViewController *)primaryViewController 
{ 
    if (self.masterNavController.topViewController) 
    { 
     return YES; 
    } 
    return NO; 
} 
+0

Обновленный оригинальный пост, я не уверен, что такое masterNavController в вашем контексте. – AppreciateIt

1

Проблема, вероятно, ваш UISplitViewController метод делегата

splitViewController: separateSecondaryViewControllerFromPrimaryViewController:

, которые вы не показали.

Я подозреваю, что он возвращает контроллер detailView, а не контроллер навигации, который его содержит.

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