转到应用程序中的第一个视图控制器

Posted

技术标签:

【中文标题】转到应用程序中的第一个视图控制器【英文标题】:Go to first view controller in app 【发布时间】:2012-04-13 20:59:52 【问题描述】:

我需要转到我的应用中的第一个视图。我有一些视图被推送到堆栈上,然后是模态导航控制器和更多视图被推送到它上面。

我遇到的问题是使用[[self navigationController] popToRootViewControllerAnimated:YES]; 只会返回到模式堆栈中的第一个视图。

我无法让[[self navigationController] popToViewController:.. 工作,因为真正的第一个视图控制器无法通过[[self navigationController] viewControllers] 访问。

关于如何做到这一点的任何想法?谢谢。

【问题讨论】:

你在调用哪个导航控制器?它会弹出到名为我想象的导航控制器的根目录。 将第一个视图控制器作为你的navigationController的rootViewcontroller 关闭模态视图控制器,然后弹出到root。 如何获取对原始导航控制器的引用,而不是通过模态转换推送的新导航控制器? 见this你有一个属性presentingViewController 【参考方案1】:

这样做:

[[self navigationController] dismissModalViewControllerAnimated:YES];

这将使您回到模态显示导航控制器的 VC。在那之后再往回走取决于您如何将那些“少数视图”推送到导航控制器之前。

编辑 - 深入根基的解释...

听起来那些“少数视图”在另一个底层导航控制器的堆栈上。这可能有点棘手,因为在该堆栈中返回更远的干净方法是让底层导航控制器弹出到它自己的根目录。但是它怎么知道它上面的modal VC已经完成了呢?

让我们称做第二个导航控制器 VC_a 的模态表示的视图控制器。它是一个模态呈现的导航控制器,其最顶层的 VC 是 VC_b。当 VC_b 模态关闭自身时,VC_a 如何知道弹出到它的导航根目录?

最好的答案(通常)是 VC_b 出于某种原因决定自行解散 - 您的应用/模型中的某些条件已更改以使其决定完成。

我们也希望 VC_a 检测到这种情况。当 VC_b 被解雇,并且 VC_a 收到 viewWillAppear 消息,因为它即将被揭露:

// VC_a.m

- (void)viewWillAppear:(BOOL)animated 

    [super viewWillAppear:animated];
    if (/* some app condition that's true when VC_b is done */) 
        // I must be appearing because VC_b is done, and I'm being uncovered
        // That means I'm done, too.  So pop...
        [self.navigationController popToRootViewControllerAnimated:NO];
     else 
        // I must be appearing for the normal reason, because I was just pushed onto the stack
    

【讨论】:

我的问题是,在关闭模式视图控制器之前,我没有参考将位于堆栈顶部的视图来告诉它 popToRoot。在单个模态视图之前的所有其他视图都使用 performSegueWithIdentifier 进行了推送转换,它们都不是模态的。 但是对第二个导航控制器进行模态呈现的那个人知道它是谁。该人将知道导航控制器在获得(第二个)viewWillAppear 时被解除。那个人可以自己弹出。请查看我的编辑。 换句话说,被解雇的人不知道该流行谁,也不应该。演示者可以。 在最后一个视图中,我只是在应用程序委托中设置了一个标志,并且在关闭模式视图后将显示的视图的 viewwillappear 中,我检查了该标志以查看是否需要 poptoroot . 很高兴它起作用了,但我希望你能找到比标志更好的解决方案......也许与模态 vc 正在做的事情有关 - 例如假设它的工作是从用户那里获取一个有效的密码,如果演示者和演示者都可以访问用户对象,那么演示者的“标志”是 user.password != nil。明白我的意思了吗?【参考方案2】:

您需要使用delegation pattern 来完成此操作。具体来说,通过创建一个实现委托的respondsToSelector 方法的协议。

请参阅this post 了解完整详情。它应该几乎正是您正在寻找的。我必须做类似的事情,除了我只需要从导航堆栈中弹出一个视图而不是使用popToRootViewControllerAnimated:

【讨论】:

这看起来也可以,我可以使用上面答案的编辑代码更快地实现它。不过谢谢【参考方案3】:

对于 ios6...

[self.view.window.rootViewController dismissViewControllerAnimated:YES completion:nil];

【讨论】:

【参考方案4】:

在 AppDelegate.m 类中使用以下流程创建方法...

-(void)MethodName//your method name
    YourViewController *objViewController = [[[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil] autorelease]; ///define your viewcontroller name like "FirstViewController" 
    UINavigationController *yourNavigationController = [[[UINavigationController alloc] initWithRootViewController:objViewController] autorelease];

    self.window.rootViewController = yourNavigationController;

当你想在 firstview 上重定向时,只需从 appdelegate 对象调用这个方法......

【讨论】:

以上是关于转到应用程序中的第一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDelegate 转到 navigationcontroller 故事板中的详细视图

从第四视图控制器目标c中的第一视图控制器访问字符串

如何正确设置 Core Data Stack 到 iOS 和 Swift 中的第一个视图控制器?

从 appDelegate 转到视图控制器

iOS 7 - 呈现模式视图控制器选择 UITabBarController 中的第一个选项卡

为旁白选择视图中的第一个元素