Iphone 从IOS应用程序注销的最佳方式是什么?

Iphone 从IOS应用程序注销的最佳方式是什么?,iphone,ios,logout,Iphone,Ios,Logout,下面的代码正在工作,但有一个bug。情况是,我首先登录进入应用程序系统。登录成功后,应用程序将设置UserDefaults(UserId)。之后,我可以使用存储的用户ID浏览应用程序视图。一旦我转到设置和选项卡注销,就会清除UserId并转到登录视图 错误:当我再次登录应用程序并单击home按钮进入iPhone桌面并关闭应用程序,然后返回再次打开时,它仍然存储着用户ID。因此,如果我转到设置并注销,将清除UserId,而不会转到login视图。我不知道为什么 守则: - (IBAction)re

下面的代码正在工作,但有一个bug。情况是,我首先登录进入应用程序系统。登录成功后,应用程序将设置UserDefaults(UserId)。之后,我可以使用存储的用户ID浏览应用程序视图。一旦我转到设置和选项卡注销,就会清除UserId并转到登录视图

错误:当我再次登录应用程序并单击home按钮进入iPhone桌面并关闭应用程序,然后返回再次打开时,它仍然存储着用户ID。因此,如果我转到设置并注销,将清除UserId,而不会转到login视图。我不知道为什么

守则:

- (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不在导航堆栈中显示登录控制器。除此之外,我没有看到对已经发布的其他答案的任何补充。