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



原文地址:https://www.cnblogs.com/xukunhenwuliao/p/3576240.html