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

Posted

技术标签:

【中文标题】在折叠显示中以编程方式关闭详细视图控制器?【英文标题】:Programmatically dismiss detail view controller in collapsed display? 【发布时间】:2014-12-23 13:12:42 【问题描述】:

问题

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

详情

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

[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;

【问题讨论】:

我遇到了完全相同的问题。你问这个问题已经有一段时间了;你有没有想出另一个解决方案,或者你只是卡住了?我很想听听您取得的任何进展。 @chrisbuchholz 现在我认为,不应该鼓励忽略细节,因为在扩展显示中没有忽略。就我而言,我隐藏了我的 rightBarButtonItem 以指示当前操作已执行,您需要自己导航回来。(我的详细 VC 是用于添加一些记录) 我的详细视图用于编辑项目。如果我点击视图中的删除按钮,则没有要编辑的项目,这会使视图无用。现在它只是使视图无效,这在 iPad 和横向的 6 Plus 上非常好,但否则它是无用的,应该发生的是应该显示带有将您带到详细视图的项目的 tableview。 【参考方案1】:

好的,我找到了一个似乎可行的解决方案。我在 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)
            
        
    

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

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

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

【讨论】:

现在埋在其他东西中......当我尽快回到我的项目时,我会测试这个 @jchnxu:只是在 ping 你。如果解决方案实际上是解决方案,则应将其标记为此类。如果没有,我们应该专注于改进建议的或寻找另一个。【参考方案2】:

我希望做同样的事情,这段代码对我有用。我把它放在详细视图中,连接到导航栏中的一个按钮。

在我的应用程序中,详细视图可以多次与自身分离,并且此代码将一次返回到主视图,无论它获得多深。

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

【讨论】:

这段代码甚至可以为你编译吗?我得到Value of type 'UIViewController' has no member 'popToRootViewControllerAnimated' 除非我转换为 UINavigationController。【参考方案3】:

这似乎可行(前提是您的主窗格中有导航控制器)

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

【讨论】:

以上是关于在折叠显示中以编程方式关闭详细视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法在 AppDelegate 中以编程方式更改我的初始视图控制器?

如何在视图控制器中以编程方式切换视图? (Xcode,iPhone)

在 Swift 中以编程方式设置根视图控制器

在页面视图控制器中以编程方式使用情节提要中的视图控制器

如何在 iOS 中以编程方式从基本 UIViewController 向我的所有视图控制器添加视图

如何在android中以编程方式创建多个列表