如何确保我的Detail View Controller始终嵌入在UINavigationController中?

时间:2016-04-25 15:27:06

标签: ios swift uisplitviewcontroller

我的UISplitViewController有一个preferredDisplayMode = .AllVisibleHere是我设置故事板的方式,请注意详细视图控制器已嵌入UINavigationController中的方式。

在主视图控制器的toolBar中点击特定按钮时执行以下方法:

@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)
}

现在我用与以前相同的VC替换我的Detail View Controller,但它嵌入在UINavigationController中。该行为按照预期在6+横向模式下工作,因为它显示了navigationBar。

但是在纵向模式下,我看到了glitched行为,因为现在当新VC被推入堆栈时,我看到toolBar在原始详细信息视图控制器上消失,导致一个奇怪的过渡,显然有些东西没有'走吧。

如何正确使用showDetailViewController(..)以便我始终将详细视图控制器嵌入UINavigationController但没有任何奇怪的过渡?我认为这需要我修改UISplitViewController委托,但我不断得到'无法将UINavigationController推送到堆栈。错误。

编辑: 我修改过的唯一代表:

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
    }

我目前看到同样的行为。

2 个答案:

答案 0 :(得分:1)

问题可能是您的UISplitViewController委托方法

splitViewController:separateSecondaryViewControllerFromPrimaryViewController:

你没有表现出来。

我怀疑它返回的是detailView控制器而不是包含它的导航控制器。

答案 1 :(得分: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;
}