在折叠显示中以编程方式关闭详细视图控制器?
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)