从子视图控制器呈现主视图控制器

Posted

技术标签:

【中文标题】从子视图控制器呈现主视图控制器【英文标题】:Presenting Main View Controller from a Child View Controller 【发布时间】:2012-09-29 22:31:14 【问题描述】:

我有一个主视图控制器并正在呈现一个子视图。对于孩子内部的其中一项设置,我需要再次调用主视图控制器。它只会让事情变得更容易。

以下导致层次结构问题:

#define appDelegate (MyAppDelegate *)[[UIApplication sharedApplication] delegate]

[self presentViewController:[appDelegate mainViewController] animated:YES completion:^];

有没有什么方法可以方便的调用mainViewController而不丢失子view的状态?

编辑

这是我展示子视图的方式。

ChildViewController *childViewController = [[ChildViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:childViewController];
[childViewController release];
[self presentModalViewController:navigationController animated:NO];
[navigationController release];

【问题讨论】:

就不能新建一个parentView并推送给child吗? @KassemBagher 是的,这是一个选项,这将非常非常不方便,因为需要进行大量初始化 【参考方案1】:

您不能呈现已经呈现或位于导航堆栈中的视图控制器。什么是主视图控制器?你实例化了吗?已经添加到屏幕上了吗?

如果两者都是,您要么需要回到它(关闭它),要么先将它从它的父级中删除,然后再展示它。

【讨论】:

两者的答案都是肯定的。我已经更新了我的问题,以显示我是如何称呼孩子的。解决我的问题的最简单方法是什么? 你在用 mainViewController 做什么? 好的,我最终做的是保存子视图的实例,并将其属性设置为(nonatomic, retain),然后将其关闭以返回父视图。【参考方案2】:

在您的子视图中,您应该可以访问您的应用程序委托及其 mainViewController 属性,如下所示:

    MyApplicationDelegate *appDelegate = (MyApplicationDelegate *)[[UIApplication sharedApplication] delegate];

【讨论】:

是的,我试过了,但在presentViewController 行出现错误。 你能得到堆栈跟踪吗?让我们看看它不喜欢什么。

以上是关于从子视图控制器呈现主视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从子视图控制器访问父视图控制器的视图?

如何从子视图导航到其他视图控制器?

不会从子视图控制器弹出到父视图

从子视图控制器到容器视图控制器的通信

从子视图推送新的视图控制器

从子视图中删除视图不会调用 willRemoveSubview