在程序中经常会遇到这种情况,用户刚进入我们软件的时候我们是无需要求用户登录的,但是在下面的页面中,例如收藏,购买等页面的时候,显然在多个页面需要多次判定用户是否登录.试着用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];
}
}

最新文章

  1. Oracle内置函数:时间函数,转换函数,字符串函数,数值函数,替换函数
  2. C++变参数模板和...操作符
  3. [WebServer] Windows操作系统下 Tomcat 服务器运行 PHP 的环境配置
  4. 【工作常用代码集】批量Telnet远端端口
  5. uva10870 矩阵
  6. HDU1009老鼠的旅行 (贪心算法)
  7. C 小复习
  8. 基于Mesos运行Spark
  9. 深入windows的关机消息截获-从XP到Win7的变化
  10. C/C++中数组与指针的关系探究
  11. linux 下载文件到本地磁盘的命令是什么
  12. Java程序入口:main()方法讲解
  13. 【bzoj 4764】弹飞大爷
  14. CentOS7安装Go环境
  15. MySQL数据库(查询语句)
  16. Java 读取HDFS文件系统
  17. Android——Fragment实例精讲——底部导航栏+ViewPager滑动切换页面
  18. css文字环绕图片--遇到的问题及解决方法
  19. CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
  20. Hadoop Metrics2

热门文章

  1. js限制文本框只能输入数字方法
  2. MySQL-group-replication 配置
  3. linux释放内存命令
  4. UINavigationController 返回按钮去掉文字
  5. PHPCMS 学习
  6. poj1703 Find them, Catch them(并查集的应用)
  7. 本地测试Tomcat配置Https访问
  8. ajax回调数据 Structs has detected an unhandled exception 问题
  9. Windows调试神器:WinDBG
  10. ZThread在Windows下打印若干DEBUG信息到console的原因