Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何确保细节视图控制器始终嵌入到UINavigationController中?_Ios_Swift_Uisplitviewcontroller - Fatal编程技术网

Ios 如何确保细节视图控制器始终嵌入到UINavigationController中?

Ios 如何确保细节视图控制器始终嵌入到UINavigationController中?,ios,swift,uisplitviewcontroller,Ios,Swift,Uisplitviewcontroller,我有一个UISplitViewController,它有一个preferredDisplayMode=.AllVisible。是如何设置情节提要的,请注意细节视图控制器是如何嵌入到UINavigationController中的 当在主视图控制器的工具栏中点击特定按钮时,我执行以下方法: @IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) { self.showDetailViewContr

我有一个
UISplitViewController
,它有一个
preferredDisplayMode=.AllVisible
。是如何设置情节提要的,请注意细节视图控制器是如何嵌入到
UINavigationController
中的

当在主视图控制器的
工具栏中点击特定按钮时,我执行以下方法:

@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {    
        self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender)
}
现在,这在iPhone的纵向模式下可以正常工作,但在iPhone 6+的横向模式下,我看不到细节视图控制器(刚才显示的)的导航栏。这不是我想要的行为。请注意,默认的详细视图控制器嵌入在
UINavigationController
中,因此可以想象,当
navigationBar
突然丢失时,它看起来不一致

因此,我尝试以下方法:

@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {    
        self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("NavigationSearchViewController") as! NavigationSearchViewController, sender: sender)
}
现在,我用与以前相同的VC替换我的详细视图控制器,但它被嵌入到
UINavigationController
中。该行为在6+的横向模式下正常工作,因为它显示导航栏

但在纵向模式下,我看到了异常行为,因为现在随着新VC被推到堆栈中,我看到原始细节视图控制器上的
工具栏消失了,导致了一个奇怪的过渡,显然有些地方出了问题

如何正确使用
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
    }

我目前看到了相同的行为。

是的,实现委托:

- (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;
}

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

splitViewController:separateSecondaryViewControllerFromPrimaryViewController:

@IBAction func entertainmentBarButtonItemTapped(sender: AnyObject) {    
        self.showDetailViewController(self.storyboard!.instantiateViewControllerWithIdentifier("SearchViewController") as! SearchViewController, sender: sender)
}
但你没有表现出来


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

更新了原始帖子,我不确定masterNavController在您的上下文中是什么。