在折叠显示中以编程方式关闭详细视图控制器?

时间:2014-12-23 13:12:42

标签: ios uisplitviewcontroller

问题

在UISplitViewController折叠显示中,如何以编程方式返回主视图控制器?

详细

我用Google搜索但没有找到解决方案。不确定我是否使用了正确的关键字。这是我显示详细视图控制器的方式:

[self showDetailViewController:[[UINavigationController alloc] initWithRootViewController:detail] sender:self];

我也分别尝试了这3种方法,但没有一种方法有效:

if (self.splitViewController.collapsed) {
        UIBarButtonItem *backButtonItem = self.navigationItem.leftBarButtonItem;
        (1):[backButtonItem.target performSelector:backButtonItem.action];
        (2):[[UIApplication sharedApplication] sendAction:backButtonItem.action to:backButtonItem.target from:nil forEvent:nil];
        (3):objc_msgSend(backButtonItem.target, backButtonItem.action);
}

导航项目设置如同详细信息VC viewDidLoad:

self.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
self.navigationItem.leftItemsSupplementBackButton = YES;

3 个答案:

答案 0 :(得分:2)

好吧,我找到了一个似乎有用的解决方案。我已经在iPhone 6和iPhone 6 Plus上进行了测试,但我只是在30分钟前才发现它,所以它可能有一些不幸的副作用,我还没有遇到过。

它很快。我希望它很清楚。如果您需要我在Objective-C中提供它,请告诉我。

if let splitViewController = splitViewController {
    if splitViewController.collapsed {
        let viewControllers = splitViewController.viewControllers
        for controller in viewControllers {
            // PrimaryNavigationController is the navigation controller I use
            // as the split views master view, which is also set as its delegate
            // but it could be any UINavigationController that is the
            // primary controller of the split view
            if controller.isKindOfClass(PrimaryNavigationController) {
                controller.popViewControllerAnimated(true)
            }
        }
    }
}

当我想解雇时,我会从我的详细视图中调用它。

代码通过检查拆分视图控制器是否折叠来工作,这是弹出详细视图的唯一状态(对我来说无论如何)。然后它只是在分割视图控制器中查找当前正在播放的导航控制器,并要求它弹出它的顶视图控制器。这是有效的,因为在折叠模式下,拆分视图主视图是堆栈中唯一的视图控制器。细节视图折叠成“它”,因此成为它的当前顶视图控制器,因此是弹出的那个。

似乎工作。如果它也适合你,请告诉我。

答案 1 :(得分:2)

我本来想做同样的事情,这段代码对我有用。我将它放在详细视图中,连接到导航栏中的按钮。

在我的应用程序中,详细信息视图可以多次自行调整,并且无论线程​​的深度如何,此代码都会返回主视图。

@IBAction func unwindSegueId(sender: AnyObject) {
    if (self.splitViewController!.collapsed) {
        self.splitViewController!.viewControllers[0].popToRootViewControllerAnimated(true)
    }
}

答案 2 :(得分:1)

这似乎有效(假设主窗格中有导航控制器)

if (self.splitViewController.collapsed) {
    [(UINavigationController *)self.splitViewController.viewControllers[0]
     popToRootViewControllerAnimated:YES];
}