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

BLOCK方式实现OC程序中多个页面判定用户是否登录的更多相关文章

  1. SAP SMARTFORMS-基于内存方式在report程序中传递数据到smartforms显示

    一.准备工作 1.新建include程序 1> include程序名字:ZDD_INC_0104 2> ZDD_INC_0104  程序中的内容为 2.使用T-CODE :SE11新建两个 ...

  2. 关于微信小程序中组件和页面对全局样式的继承性

    1.组件只能继承全局样式中的font和color(backgroundcolor不继承) 2.页面可以继承全局样式中所有样式

  3. 小程序中 wx.navigateTo 页面跳转没有反应?

    页面js文件中加入 show: function () {wx.navigateTo({url: ‘/pages/show/show’})} 这个函数 目的在于要做跳转到新的页面,但是你可能会遇到一个 ...

  4. SQLServer中用户 'sa' 登录失败解决办法

    今天下午,很奇怪的网站突然就打不开了,报错如下: “/”应用程序中的服务器错误. 用户 'sa' 登录失败. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误 ...

  5. Android程序中--不能改变的事情

    有时,开发人员会对应用程序进行更改,当安装为以前版本的更新时出现令人惊讶的结果 - 快捷方式断开,小部件消失或甚至根本无法安装. 应用程序的某些部分在发布后是不可变的,您可以通过理解它们来避免意外. ...

  6. struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

    实现目标:       1.使用验证框架对用户注冊信息进行验证       2.验证username.password.邮箱不能为空       3.验证username.password长度     ...

  7. 在小程序中实现 Mixins 方案

    摘要: 小程序开发技巧 作者:jrainlau 原文:在小程序中实现 Mixins 方案 Fundebug经授权转载,版权归原作者所有. 在原生开发小程序的过程中,发现有多个页面都使用了几乎完全一样的 ...

  8. 小程序中嵌套的h5页面设置分享转发

    场景描述:当在小程序中打开h5页面时,希望小程序的转发出去的标题,图片,跳转link可以通过h5通信实现自定义. 实现方式:通过h5给小程序通信,发送标题,图片,跳转link等信息,让小程序设置分享. ...

  9. 微信小程序中路由跳转

    一.是什么 微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能 在微信小程序中,每个页面可以看成是一个pageMo ...

随机推荐

  1. 4~20mA模拟输出(电流环)应用笔记(转)

    https://zm12.sm-tc.cn/?src=http%3A%2F%2Fwww.aichengxu.com%2Fview%2F5397788&uid=d2f68cd7fd230c162 ...

  2. python \uxxxx转中文,Python列表中的字典 \uxxxx转中文,

    import json a = [{u', u'roleFlag': 7}] print json.dumps(a).decode("unicode_escape") 输出结果是: ...

  3. rpm | yum 安装软件包时key过期

    1.问题: yum -y install docker-io Loaded plugins: fastestmirror, refresh-packagekit, security Setting u ...

  4. c#, extract number from string

    using System.Text.RegularExpressions; string numberStr = Regex.Match (str, "[0-9]").Value; ...

  5. atitit.验证码识别step4--------图形二值化 灰度化

    atitit.验证码识别step4--------图形二值化 灰度化 1. 常见二值化的方法原理总结 1 1.1. 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于12 ...

  6. MVC之旅(1)

    其实很久很久之前就有接触asp.net mvc了.那些年,还是在大学校园的美好青葱时光,常常听到一些大牛开口闭口都是mvc,心痒痒的也去图书馆借了本mvc的教材,应该是mvc 2.悲催的是,我都没知道 ...

  7. 基于Java语言开发jt808、jt809技术文章精华索引

    很多技术开发人员喜欢追逐最新的技术,如Node.js, go等语言,这些语言只是解决了某一个方面,如只是擅长异步高并发等等,却在企业管理后台开发方面提供的支持非常不够,造成项目团队技术选项失败,开发后 ...

  8. TCP/IP模型

    TCP/IP是一组用在实现网络相互连接的通信协议,internet网络体系结构就是以TCP/IP为核心的. TCP/IP分成了四个层次 1.应用层 应用层对应与OSI参考模型的高层,为用户提供了所需要 ...

  9. 缓存数据库redis、memcached。 MongoDB 资源集锦

    Redis学习资源: 1.Redis学习手册 http://www.cnblogs.com/stephen-liu74/archive/2012/03/14/2349815.html 2.c#连接Re ...

  10. splay旋转模板

    splay旋转模板 void rotate(int x) { int y=f[x],z=son(x);f[x]=f[y]; if (f[x]) t[f[x]][son(y)]=x; t[y][z]=t ...