如何在不设置“userID”的情况下注销nil

时间:2016-06-06 13:15:38

标签: ios objective-c login logout

使用以下代码,我可以成功注销并在再次打开应用程序时显示登录屏幕。

我有一个用户个人资料页面,用于获取特定用户的所有数据。但是,登录后会出现问题。我获取了所有用户的数据。然后,当我最小化应用程序并再次打开它时,我的配置文件页面中的所有数据都将丢失。我认为这是因为我使用nil方法将用户ID设置为setObject

有没有人知道如何使这项工作?

- (IBAction)logoutButtonTapped:(id)sender {

   UIAlertView* alert = [[UIAlertView alloc] 
       initWithTitle:@"Confirmation" 
       message:@"Do you want to Logout?"
       delegate:self
       cancelButtonTitle:@"Cancel"
       otherButtonTitles:@"OK", nil];

   [alert show];


    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

   [prefs setObject:nil forKey:@"userID"];

   [prefs synchronize];

}

以下是我用于注销的代码:

  -(void)nextScreen: (NSTimer *) timer
 {
      NSLog(@"TEST");
      NSString * storyboardName = @"Main";
     UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
     MenuScreenViewController *viewcontroller = [storyboard instantiateViewControllerWithIdentifier:@"loginScreenViewController"];

[self.navigationController pushViewController:viewcontroller animated:YES];
  }


   -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:  (NSInteger)buttonIndex
 {
      NSTimer* timer = [NSTimer scheduledTimerWithTimeInterval:2
                                                  target:self
                                                  selector:@selector(nextScreen:)
                                                userInfo:nil
                                                 repeats:NO];

     [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
     [timer fire];


   if (buttonIndex != 0)  // 0 == the cancel button
  {
    //home button press programmatically
    UIApplication *app = [UIApplication sharedApplication];
    [app performSelector:@selector(suspend)];

    //wait 2 seconds while app is going background
    [NSThread sleepForTimeInterval:2.0];

    //exit app when app is in background
     NSLog(@"TIMER CALLED");
     exit(0);
}else{

     }

2 个答案:

答案 0 :(得分:0)

您可以使用一个存储登录状态的bool变量。如果已成功登录,则将状态存储到yesNSUserdefaults。使用时点击NO即可存储logout。 因此,您可以time of app launching查看如果状态为真,则rootviewcontrollerhomescreen其他logingscreeen

不要操纵userId以便您可以使用它。使用此布尔状态。

第二件事如果您在退出按钮上显示确认的alertview按钮,则不要在该操作方法中操纵NSUserdefaults。因为如果用户按cancel,那么您的user default也会更改,并将用户视为logout

因此,您应该使用alertview delegate方法来处理点击alertview。您应该从user defaults按钮点击ok操纵alertview,这可以通过委托方法实现。

希望这会有所帮助:)

答案 1 :(得分:0)

当您致电[alert show]时,似乎您认为它停止在那里执行您的方法,并且只有在用户点击确定时才会继续。它不会那样工作。结果是,您在显示提醒视图,方法仍在继续,然后在点按任意按钮之前立即将userID设置为nil 。然后,您可以点击警报视图中的按钮,并将有关您所点击的内容的信息丢弃。

如果您只想点击确定即可将某人注销,那么您需要实施UIAlertViewDelegate协议,并将userID设置为nil如果点击了右键,则在委托方法中。

请注意,UIAlertView已弃用,您应该在新代码中使用UIAlertController