BLOCK方式实现OC程序中多个页面判定用户是否登录
在程序中经常会遇到这种情况,用户刚进入我们软件的时候我们是无需要求用户登录的,但是在下面的页面中,例如收藏,购买等页面的时候,显然在多个页面需要多次判定用户是否登录.试着用block简单的实现了一下该功能,先上代码,代码下面统一解释.
#import "AppDelegate.h" #import "LoginViewController.h" #import "CollectViewController.h" @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 这3行代码 的作用 是从持久化中移除已经存储的用户数据 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults removeObjectForKey:@"username"]; [defaults removeObjectForKey:@"password"]; // UITabBarController *tabBarController = (UITabBarController *)[self.window rootViewController]; tabBarController.delegate = self; // Override point for customization after application launch. return YES; } - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *userName = [defaults objectForKey:@"username"]; NSString *password = [defaults objectForKey:@"password"]; if (userName != nil && password != nil) { NSLog(@"已经登录过"); }else{ UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; LoginViewController *loginVC = [storyBoard instantiateViewControllerWithIdentifier:@"login"]; loginVC.successBlock = ^(id info){ tabBarController.selectedViewController = viewController; //此处的block可以将其参数传到这个页面,在执行这个代理方法的时候.需要将参数传到哪一个页面,就在哪一个页面实现以下block.请参看下一段代码,其参数为一个字典,可以在此处打印 NSLog(@"%@",info); }; [tabBarController setSelectedIndex:0]; [tabBarController presentViewController:loginVC animated:YES completion:nil]; } }
上文中,使用了AppDelegate中的一个代理方法,以及tabbarcontroller 的一个选中的代理方法.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
这个代理方法,是程序已经运行,并且用户已经登录成功之后,需要执行的代理方法.
在这个方法中,我们使用了NSUserDefaults这个类,详细介绍课参照本人的上一篇博客.登录结束后,使用这个方法将用户默认的配置文件中的用户名和密码移除,如果不移除的话,运行之后就可以直接登录了.
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
在第二个代理方法中,用户显然是选中了一个控制器,这个时候,我们首先判断,用户的默认配置文件中的用户名和密码是否还是存在的.如果不是nil,显然,用户已经是登录成功了,我们是需要空实现,或者简单的打一个log即可.
如果不是,显然,用户还是没有登录的.我的程序使用了storyboard,需要注意的是其使用的过程中初始化的方法,显然,故事版一般只 有一个,里面你搭建好的控制器也是唯一存在的一个,他有自己唯一的标示符.我们可以使用和故事版中和其相同的类创建一个实例.也就是出现了一个登录界面. 这里就不再一一赘述了.
[tabBarController setSelectedIndex:0];//此处,如用户在第二个item中点击登录,但是密码输入错误后,还是会进入到了第二个item,但是我们默认的设置是 不登陆的话,不能进入到第二个item.
以下是登录界面的是实现代码:
- (IBAction)login:(id)sender { if ([_userNameTF.text isEqualToString:@"test"]&&[_passwordTF.text isEqualToString:@"123456"]) { NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setObject:_userNameTF.text forKey:@"username"]; [userDefaults setObject:_passwordTF.text forKey:@"password"]; NSLog(@"验证成功"); NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:@"111",@"nickname",@"28",@"age",@"100000",@"money", nil]; [self.presentingViewController dismissViewControllerAnimated:YES completion:^{ _successBlock(userInfo); }]; }else{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"密码或用户名错误" message:@"测试账号:test,密码:123456" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles: nil]; [alert show]; } }