如何关闭多个 presentModalViewControllers 并返回到根标签栏控制器?

Posted

技术标签:

【中文标题】如何关闭多个 presentModalViewControllers 并返回到根标签栏控制器?【英文标题】:How to dismiss multiple presentModalViewControllers and get back to the root Tab Bar controller? 【发布时间】:2011-04-24 21:24:30 【问题描述】:

我有一个在启动时显示 presentModalViewController 的应用程序。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions     

    // Override point for customization after application launch.

    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    Overview *overviewViewController = [[Overview alloc] initWithNibName:@"Overview" bundle:nil];
    [self.tabBarController presentModalViewController:overviewViewController animated:YES];
    [overviewViewController release];
    [self.window makeKeyAndVisible];
    return YES;

一旦显示了overviewController,用户就可以登录或注册。如果他们选择登录,那么我正在使用另一个让他们登录的 presentModalViewController:

  -(IBAction) btnLoginPressed

//  [self dismissModalViewControllerAnimated:YES];
    Login *loginOverView = [[Login alloc] initWithNibName:@"Login" bundle:nil];
    [self presentModalViewController:loginOverView animated:YES];
    [loginOverView release];



但是,在成功登录后,我希望 presentModalViewController 都消失,让我回到作为标签栏控制器的根控制器。

我已尝试执行以下操作,但它不起作用:

-(IBAction) btnSubmitLoginPassword

    //make web service call
//  [self dismissModalViewControllerAnimated:YES];
    [self.tabBarController dismissModalViewControllerAnimated:YES];

现在在我的谷歌搜索中,我遇到了我不熟悉的代表概念。有人可以花时间帮助我解决我的困境吗?

提前致谢

【问题讨论】:

【参考方案1】:

视图控制器组织在一个堆栈中。您可以使用 UINavigationController 方法 popToRootViewControllerAnimated: 或 popToViewController:animated: 来控制从堆栈顶部弹出多少视图。

您可以通过应用程序委托访问 UINavigationController 实例。

将所有视图控制器弹出到根视图控制器:(我认为这是您所要求的)

UIApplicationDelegate* delegate = [[UIApplication sharedApplication] delegate];
[delegate.navigationController popToRootViewControllerAnimated:YES];

将所有视图控制器弹出到堆栈中的已知视图控制器:

UIApplicationDelegate* delegate = [[UIApplication sharedApplication] delegate];
[delegate.navigationController popToViewController:popToViewController animated:YES];

【讨论】:

它适用于任何类型的视图,虽然我不知道你所说的“模态视图”是什么意思...... 我的意思是通过调用 presentModalViewController:animated 方法加载的视图控制器。 对不起,我错过了你在哪里使用 presentModalViewController。我实际上不知道,但我想我明白......不。你为什么不改变你的代码来使用 pushViewController:animated: 代替? 我不是问这个问题的人。【参考方案2】:

在您的 Overview.h 中添加 id delegate;@property (nonatomic, retain) id delegate;。在您的 Overview.m 中添加@synthesize delegate。然后在您的initWithNibName:bundle 后面添加以下内容:

[overviewViewController setDelegate: self];

对你的登录类做同样的事情: 在 Login.h 中添加 id delegate;@property (nonatomic, retain) id delegate;。在您的 Login.m 中添加 @synthesize delegate。然后在您的initWithNibName:bundle 之后添加以下内容:

[overviewViewController setDelegate: self];

在您的 Overview.m 中添加以下方法:

- (void)dismissLoginView 
    [self dismissModalViewControllerAnimated: NO];
    [delegate dismissModalViewControllerAnimated: YES];

将您的 -(IBAction) btnSubmitLoginPassword 更改为

-(IBAction) btnSubmitLoginPassword 
    [delegate dismissLoginView];

我没有测试过。我希望它有效!没有的时候告诉我。

【讨论】:

以上是关于如何关闭多个 presentModalViewControllers 并返回到根标签栏控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何让虚拟主机接受多个域? [关闭]

如何关闭多个 goroutine 正在发送的通道?

如何关闭多个数据集

Android:如何设置多个按钮、编辑文本等 [关闭]

如何在多个页面上拉伸表格[关闭]

如何在变量中存储多个字母? [关闭]