如何关闭多个 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 并返回到根标签栏控制器?的主要内容,如果未能解决你的问题,请参考以下文章