弹出一个以模态方式呈现的 UINavigationController

Posted

技术标签:

【中文标题】弹出一个以模态方式呈现的 UINavigationController【英文标题】:Pop a UINavigationController that was presented modally 【发布时间】:2012-09-10 02:34:27 【问题描述】:

我正在开发一个 ios 5 应用程序,它首先向用户显示登录窗口。成功登录后,会执行 Modal Segue,显示 UINavigationController,其中包含实际应用程序的大部分内容。现在从这一点开始可能会发生很多事情,但我感兴趣的是用户何时决定注销。

我想返回第一个视图,即登录窗口,但我似乎无法弹出导航控制器并返回第一个视图。

作为可视化:

                                             (NavigationController)
[UserLoginViewController] --modal segue-> [UserMenuTableViewController] --push segue--> [otherviews, etc]
     ^                                                  |
     |                                             modal segue
     |                                                  |
     |                                                  v
     ^                                    [UserDashBoardViewController]
     |                                                  |
     |                                           (logout pressed)
     |                                                  |
      -<---------------pop back to login--------------<-

我尝试过委托,以通知初始登录视图是时候关闭模态呈现的导航控制器,但我收到错误:

2012-09-10 11:13:05.749 KITxWebMobileJSONv4[1138:f803] attempt to dismiss modal view controller whose view does not currently appear. self = <UINavigationController: 0x68c6150> modalViewController = <UserDashboardViewController: 0x68d9fb0>
2012-09-10 11:13:05.749 KITxWebMobileJSONv4[1138:f803] attempt to dismiss modal view controller whose view does not currently appear. self = <UserLoginViewController: 0x688ffa0> modalViewController = <UINavigationController: 0x68c6150>

登录视图委托如下所示:

// This method is called from the UserMenuTableViewController, when it's time to log out:
- (void)userMenuTableViewController:(UserMenuTableViewController *)sender
                          loggedOut:(BOOL)didLogOut

    if (didLogOut) 
        /* delete user info and take care of data on backend:
         * ...
         */

        // pop navigation controller, presenting the initial Login View:
        [self dismissModalViewControllerAnimated:YES];  // THIS LINE FIRES AND GETS THE ERROR ABOVE
    



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"Login Success"])   // successful login:

        // set (UINavigationController *)self.nav to the segue destination (for a handle, if needed):
        self.nav = (UINavigationController *)segue.destinationViewController;

        // grab the user menu and set self to be it's delegate:
        UserMenuTableViewController *userMenu = [self.nav.viewControllers lastObject];
        userMenu.delegate = self;
    

提前致谢!

【问题讨论】:

您的错误消息中提到了UserDashboardViewController,但我在您的帖子中没有看到任何其他提及。 UserDashboardViewController 是如何呈现的?它和UserMenuTableViewController是什么关系? 您是否在调用dismissModalViewControllerAnimated: 之前手动将所有视图控制器从NavigationController 的堆栈中弹出? This 问题处理类似的情况(尽管承认链接多个模态视图控制器),其中尝试同时执行多个解除调用是问题。 你是如何对导航控制器进行模态搜索的? @robmayoff , UserDashboardViewController 是另一个模态视图,由 NavigationController 通过选项卡按钮呈现。这是他们可以选择退出的地方。当他们这样做时,一条消息通过委托传递回UserMenuTableViewController,以关闭模式UserDashboardViewController,然后继续注销。这很好用,在注销时,NavigationController 中的所有视图都会弹出并清理。它正在弹出 NavigationController 的根视图控制器 (UserMenuTableViewController),但没有发生。 @Xono ,用户可以选择注销的UserDashboardViewController,只能在 NavigationController 的根视图中访问。当他们触摸条形按钮时,它会以模态方式显示,他们可以从那里注销。如果他们这样做了,根视图控制器 (UserMenuTableViewController) 通过委托被告知关闭 UserDashboardViewController。这很好用。但现在我需要弹出实际的 NavigationController 以返回第一个 View,它通过模态 segue 呈现 UserMenuTableViewController 【参考方案1】:

在调用 NavigationController 后出现的 viewController 中,调用它

[self dismissViewControllerAnimated:YES completion:nil];

你想在哪里弹出你的navigationController。这对我有用。

【讨论】:

成功了!但是我一定有一些逻辑问题,因为当我从UserDashboardViewController 的委托方法调用它时,什么也没有发生。但是当我从一个虚拟按钮调用它时,我只是把它放在我的工具栏中来测试这行代码,它工作得很好。谢谢! 只是为了结束。当用户选择从UserDashboardViewController 注销时,一条消息通过委托传递回呈现视图(UserMenuTableViewController),我将BOOL 属性shouldLogOut 设置为YES。在UserMenuTableViewControllerviewDidAppear 方法中,如果shouldLogOut 为YES,我调用[self dismissViewControllerAnimated:YES completion:nil];。完美运行!【参考方案2】:

有点太晚了,但你可以使用 unwind segues 来做到这一点,它会相应地解开。

【讨论】:

以上是关于弹出一个以模态方式呈现的 UINavigationController的主要内容,如果未能解决你的问题,请参考以下文章

UIActivity activityViewController 在 iPad 上以模态方式呈现,而不是在弹出窗口中

以模态方式呈现 ViewController

关闭模态 UINavigation 控制器

presentViewController 不隐藏弹出框,弹出框出现在呈现的模态视图上

仅关闭 2 个模态呈现的视图控制器中的 1 个

如何使我的键盘弹出窗口更加流畅,我的视图控制器以模态方式出现?