BLOCK方式实现OC程序中多个页面判定用户是否登录
2024-08-25 06:55:10
在程序中经常会遇到这种情况,用户刚进入我们软件的时候我们是无需要求用户登录的,但是在下面的页面中,例如收藏,购买等页面的时候,显然在多个页面需要多次判定用户是否登录.试着用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];
}
}
最新文章
- Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数
- C++变参数模板和...操作符
- [WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置
- 【工作常用代码集】批量Telnet远端端口
- uva10870 矩阵
- HDU1009老鼠的旅行 (贪心算法)
- C 小复习
- 基于Mesos运行Spark
- 深入windows的关机消息截获-从XP到Win7的变化
- C/C++中数组与指针的关系探究
- linux 下载文件到本地磁盘的命令是什么
- Java程序入口:main()方法讲解
- 【bzoj 4764】弹飞大爷
- CentOS7安装Go环境
- MySQL数据库(查询语句)
- Java 读取HDFS文件系统
- Android——Fragment实例精讲——底部导航栏+ViewPager滑动切换页面
- css文字环绕图片--遇到的问题及解决方法
- CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
- Hadoop Metrics2