我是这个领域的新手。我正在开发一个应用程序,用户可以从应用程序内的任何页面注销。
我在退出过程中使用此方法。 (摘自What is the perfect way to make a logout from IOS app?)
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex == 0) {
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:nil forKey:@"UserId"];
[defaults synchronize];
//redirect to login view
NewClassMoonAppDelegate * appsDelegate =[[UIApplication sharedApplication] delegate];
LoginViewController *second = [[LoginViewController alloc]initWithNibName:nil bundle:nil];
[appsDelegate.window setRootViewController:nil];
[appsDelegate.window setRootViewController:login];
}
}
我的问题是如何在执行注销之前关闭所有打开的ViewController?当我实现上述方法时,我点击了注销按钮的页面在后台保持打开状态。任何人都可以帮助我。提前致谢。
答案 0 :(得分:1)
首先解雇所有模态UIViewControllers
,你可以做某事。喜欢这个方法
-(void)dismissModalStack {
UIViewController *vc = self.presentingViewController;
while (vc.presentingViewController) {
vc = vc.presentingViewController;
}
[vc dismissViewControllerAnimated:YES completion:NULL];
}
(如下所示:iPhone - dismiss multiple ViewControllers)
而不是
[self.navigationController popToRootViewControllerAnimated:YES];
因为这只会将您推送的UIViewControllers
弹出导航堆栈。
所以对你来说就是
-(void) actionSheet: (UIActionSheet * ) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex {
if (buttonIndex == 0) {
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject: nil forKey: @"UserId"];
[defaults synchronize];
UIViewController *vc = self.presentingViewController;
while (vc.presentingViewController) {
vc = vc.presentingViewController;
}
[vc dismissViewControllerAnimated:YES completion:NULL];
NewClassMoonAppDelegate * appsDelegate = [[UIApplication sharedApplication] delegate];
LoginViewController * second = [[LoginViewController alloc] initWithNibName: nil bundle: nil];
[appsDelegate.window setRootViewController: login];
}
}
答案 1 :(得分:1)
对于NSNotification
来说,这是一个完美的工作:当用户点击“注销”按钮时,您会触发自定义通知,如下所示:
[[NSNotificationCenter defaultCenter] postNotificationName:@"userWillLogoutNotification" object:nil userInfo:nil];
然后每个视图/导航/标签栏/任何控制器都可以做出相应的反应并“重置”自己。
执行此导航任务不是“注销”按钮的工作,每个控制器只处理自己的业务并对此类应用程序范围的通知作出反应。