Iphone 从IOS应用程序注销的最佳方式是什么?
下面的代码正在工作,但有一个bug。情况是,我首先登录进入应用程序系统。登录成功后,应用程序将设置UserDefaults(UserId)。之后,我可以使用存储的用户ID浏览应用程序视图。一旦我转到设置和选项卡注销,就会清除UserId并转到登录视图 错误:当我再次登录应用程序并单击home按钮进入iPhone桌面并关闭应用程序,然后返回再次打开时,它仍然存储着用户ID。因此,如果我转到设置并注销,将清除UserId,而不会转到login视图。我不知道为什么 守则:Iphone 从IOS应用程序注销的最佳方式是什么?,iphone,ios,logout,Iphone,Ios,Logout,下面的代码正在工作,但有一个bug。情况是,我首先登录进入应用程序系统。登录成功后,应用程序将设置UserDefaults(UserId)。之后,我可以使用存储的用户ID浏览应用程序视图。一旦我转到设置和选项卡注销,就会清除UserId并转到登录视图 错误:当我再次登录应用程序并单击home按钮进入iPhone桌面并关闭应用程序,然后返回再次打开时,它仍然存储着用户ID。因此,如果我转到设置并注销,将清除UserId,而不会转到login视图。我不知道为什么 守则: - (IBAction)re
- (IBAction)resetKeychain:(id)sender {
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Are you sure you want to logout?"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:@"Logout"
otherButtonTitles:nil];
actionSheet.actionSheetStyle = UIActionSheetStyleDefault;
[actionSheet showFromTabBar:self.tabBarController.tabBar];
[actionSheet release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
if (buttonIndex ==0) {
//logout
NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults];
//delete user ID fro user Defaults
[defaults setObject:nil forKey:@"UserId"];
//redirect to login view
NewClassMoonAppDelegate * appsDelegate =[[UIApplication sharedApplication] delegate];
[appsDelegate.window addSubview:[appsDelegate.login view]];
}
}
从我对你的问题的理解来看,我认为这个问题需要格式化,并且要连贯一致:
a) 您的@“UserID”
值未与NSUserDefaults
同步,因为您没有调用-synchronize
方法NSUserDefaults
将更新其内存键值存储,但不会将其写入磁盘,这意味着它会在任意时间丢失
b) 它不会进入loginView
的事实可能与以下任何原因有关,很可能它已经是UIWindow
的子视图。因此,不要重复使用应用程序委托中的login
属性,而是创建View Controller
的新实例变量,并将其设置为rootViewController
- (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 *login = [[LoginViewController alloc] initWithNibName...];
[appsDelegate.window setRootViewController:nil];
[appsDelegate.window setRootViewController:login];
}
}
Swift: 马克斯的回答有一些变化:
let objectsToSave: [String] = [obj1, obj2, obj3]
for key in objectsToSave {
NSUserDefaults.standardUserDefaults().removeObjectForKey(key)
}
let appsDelegate = UIApplication.sharedApplication().delegate
let storyboard = UIStoryboard(name: "MainStoryboard", bundle: nil)
let newLoginVC: LoginViewController = storyboard.instantiateInitialViewController() as! LoginViewController
appsDelegate?.window!!.rootViewController = nil
appsDelegate?.window!!.rootViewController = newLoginVC
编辑:我所做的唯一更改就是通过故事板而不是initWitName初始化newLoginVC。创建UINavigation控制器的属性并合成它,然后在注销按钮上写下下面的代码
AppDelegate * appDelegateObj =[[UIApplication sharedApplication] delegate];
login *loginObj = [[login alloc]initWithNibName:@"login" bundle:nil];
[appDelegateObj.window setRootViewController:nil];
navObj=[[UINavigationController alloc]initWithRootViewController:loginObj];
[appDelegateObj.window setRootViewController:navObj];
没有“完美的解决方案”这回事。记住,最好的是好的敌人。嘿,马克斯,你的解决方案很棒,但我有一个疑问,我需要在登录出应用程序之前从我加载的内存中删除所有其他MVC吗?如果不是,那些MVC会发生什么?他们会在记忆中吗?应该如何处理此场景?由rootViewController和rootViewController本身呈现的任何场景都将从内存中释放。这不会立即发生,因为您可能会在应用程序的其他位置保留引用,或者编译器可能还没有准备好这样做。请进一步解释,为什么会发生更改,以及您使用它实现了什么。但是,此解决方案可以导航回loginVC,注销时,不会释放为上一个用户会话分配的视图控制器。如何取消分配所有视图控制器?为什么需要
UINavigationController
?OP不在导航堆栈中显示登录控制器。除此之外,我没有看到对已经发布的其他答案的任何补充。