4

下面的代码正在运行,但有一个错误。场景是,我首先登录进入应用系统。登录成功后,应用程序将设置 UserDefaults (UserId)。之后,我可以使用存储的 UserId 导航应用程序视图。一旦我进入设置和选项卡注销,这将清除 UserId 并进入登录视图。

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

编码:

- (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]];

    }
}
4

3 回答 3

8

从我可以从你的问题中解释出来,顺便说一下,这个问题需要格式化和连贯,我相信:

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];

    }
}
于 2013-01-31T18:44:53.683 回答
1

斯威夫特

max_的回答中进行了一些更改:

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

编辑:我所做的唯一更改是我通过情节提要初始化 newLoginVC 而不是initWitName

于 2015-12-16T02:35:44.510 回答
0

制作 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];
于 2016-04-06T13:22:59.620 回答