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

jch*_*nxu 7 uisplitviewcontroller ios

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

详情

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

[self showDetailViewController:[[UINavigationController alloc] initWithRootViewController:detail] sender:self];
Run Code Online (Sandbox Code Playgroud)

我也分别尝试了这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);
}
Run Code Online (Sandbox Code Playgroud)

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

self.navigationItem.leftBarButtonItem = self.splitViewController.displayModeButtonItem;
self.navigationItem.leftItemsSupplementBackButton = YES;
Run Code Online (Sandbox Code Playgroud)

chr*_*olz 3

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

速度很快。我希望它是清楚的。如果您需要我用 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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我想关闭它时,我会从详细视图中调用它。

该代码的工作原理是检查分割视图控制器是否折叠,这是弹出详细视图有意义的唯一状态(无论如何对我来说)。然后它只是在分割视图控制器中查找当前正在运行的导航控制器,并要求它弹出它的顶部视图控制器。这是有效的,因为在折叠模式下,分割视图主视图是堆栈中唯一的视图控制器。详细视图被折叠到“其中”,因此成为它的当前顶视图控制器,因此是弹出的视图控制器。

似乎有效。让我知道它是否也适合你。