不同页面间的通知
2016-06-14 13:22
387 查看
1. 首先创建两个不同的类,代表2个页面,一个作为主界面,一个作为跳转页面
2. 这里以一个这种场景为例:通常一个应用登陆后会显示用户信息,而登陆信息可以通过登陆界面获取。
在主界面中添加监听,在登陆界面发送通知,一旦登陆成功将向通知中心发送成功登陆的通知,此时主界面种由于已经添加通知监听所以会收到通知并更新ui界面
3. 主界面
有一个label和一个按钮,lable设置了大小/文字对齐方式,并没有对具体内容进行设置,这个用来在登陆成功后显示用户信息
点击登陆,出现下面的界面:
输入正确的用户名和密码,进入下面的页面:
以前显示登陆文字的按钮显示为注销,点击注销会显示登陆界面
二、实现步骤:
1. 为登陆按钮添加点击事件:
//登陆按钮的点击事件,因为是点击事件调用addObserverToNotification函数,addObserverToNotification函数添加监听事件updateLoginInfo:,所以单击登陆按钮后会将用户信息赋值给lable且按钮文字显示为注销
-(void)loginout
{
//1. 添加监听
[self
addObserverToNotification];
//创建第二个页面
JDLoginViewController *longinController = [[JDLoginViewController
alloc] init];
[self
presentViewController:longinController animated:YES
completion:nil];//跳转到下一个页面
}
其中,addObserverToNotification函数为:
//添加监听的函数实现,在这个函数中添加监听
- (void)addObserverToNotification
{
//添加一个监听者 self
使用函数updateLoginInfo:来监听,监听的通知的名字是UPDATE_LOGIN_NOTIFICATION,不关心通知的发布者是谁
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(updateLoginInfo:)
name:UPDATE_LOGIN_NOTIFICATION
object:nil];
}
/**
* 更新登陆信息,注意在这里可以获得通知对象并且读取附加信息
*/
//监听通知的方法
- (void)updateLoginInfo:(NSNotification *)notification
{
//获取用户信息
NSDictionary *userInfo = notification.userInfo;
_lblLoginInfo.text = userInfo[@"loginInfo"];
_btnLogin.titleLabel.text =
@"注销";
}
2. 第二个页面
//第二个界面中登陆按钮的点击事件
-(void)Login
{
if ([_txtUserName.text
isEqualToString:@"kenshincui"] && [_txtPassword.text
isEqualToString:@"123"])
{
//这里调用postNotification发送一个通知
[self
postNotification];
//界面回到第一个界面
[self
dismissViewControllerAnimated:YES
completion:nil];
}
else
{
//登陆失败弹出提示信息
UIAlertView *alert = [[UIAlertView
alloc] initWithTitle:@"系统信息"
message:@"用户名或密码错误,请重新输入!"
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:nil,
nil];
[alert show];
}
}
//如果点击了取消按钮,直接返回第一个页面
- (void)cancel
{
[self
dismissViewControllerAnimated:YES
completion:nil];
}
/**
* 添加通知,注意这里设置了附加信息
*/
- (void)postNotification
{
//通知的具体内容
NSDictionary *userInfo =
@{@"loginInfo" : [NSString
stringWithFormat:@"Hello,%@!",_txtUserName.text]};
NSLog(@"%@",userInfo);
//创建一个通知,包括通知的名称/发布者/通知的内容
NSNotification *notificaiton = [NSNotification
notificationWithName:UPDATE_LOGIN_NOTIFICATION
object:self
userInfo:userInfo];
//利用通知中心发布一个通知
[[NSNotificationCenter
defaultCenter] postNotification:notificaiton];
//也可以直接采用下面的方法
// [[NSNotificationCenter defaultCenter]postNotificationName:UPDATE_LOGIN_NOTIFICATION object:self userInfo:userInfo];
}
三、消息中心
对于很多初学者往往会把iOS中的本地通知、推送通知和iOS通知中心的概念弄混。其实二者之间并没有任何关系,事实上它们都不属于一个框架,前者属于UIKit框架,后者属于Foundation框架。
通知中心实际上是iOS程序内部之间的一种消息广播机制,主要为了解决应用程序内部不同对象之间解耦而设计。它是基于观察者模式设计的,不能跨应用程序进程通信,当通知中心接收到消息之后会根据内部的消息转发表,将消息发送给订阅者。下面是一个简单的流程示意图:
了解通知中心需要熟悉NSNotificationCenter和NSNotification两个类:
NSNotificationCenter:是通知系统的中心,用于注册和发送通知,下表列出常用的方法。
NSNotification:代表通知内容的载体,主要有三个属性:name代表通知名称,object代表通知的发送者,userInfo代表通知的附加信息。
2. 这里以一个这种场景为例:通常一个应用登陆后会显示用户信息,而登陆信息可以通过登陆界面获取。
在主界面中添加监听,在登陆界面发送通知,一旦登陆成功将向通知中心发送成功登陆的通知,此时主界面种由于已经添加通知监听所以会收到通知并更新ui界面
3. 主界面
有一个label和一个按钮,lable设置了大小/文字对齐方式,并没有对具体内容进行设置,这个用来在登陆成功后显示用户信息
点击登陆,出现下面的界面:
输入正确的用户名和密码,进入下面的页面:
以前显示登陆文字的按钮显示为注销,点击注销会显示登陆界面
二、实现步骤:
1. 为登陆按钮添加点击事件:
//登陆按钮的点击事件,因为是点击事件调用addObserverToNotification函数,addObserverToNotification函数添加监听事件updateLoginInfo:,所以单击登陆按钮后会将用户信息赋值给lable且按钮文字显示为注销
-(void)loginout
{
//1. 添加监听
[self
addObserverToNotification];
//创建第二个页面
JDLoginViewController *longinController = [[JDLoginViewController
alloc] init];
[self
presentViewController:longinController animated:YES
completion:nil];//跳转到下一个页面
}
其中,addObserverToNotification函数为:
//添加监听的函数实现,在这个函数中添加监听
- (void)addObserverToNotification
{
//添加一个监听者 self
使用函数updateLoginInfo:来监听,监听的通知的名字是UPDATE_LOGIN_NOTIFICATION,不关心通知的发布者是谁
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(updateLoginInfo:)
name:UPDATE_LOGIN_NOTIFICATION
object:nil];
}
/**
* 更新登陆信息,注意在这里可以获得通知对象并且读取附加信息
*/
//监听通知的方法
- (void)updateLoginInfo:(NSNotification *)notification
{
//获取用户信息
NSDictionary *userInfo = notification.userInfo;
_lblLoginInfo.text = userInfo[@"loginInfo"];
_btnLogin.titleLabel.text =
@"注销";
}
2. 第二个页面
//第二个界面中登陆按钮的点击事件
-(void)Login
{
if ([_txtUserName.text
isEqualToString:@"kenshincui"] && [_txtPassword.text
isEqualToString:@"123"])
{
//这里调用postNotification发送一个通知
[self
postNotification];
//界面回到第一个界面
[self
dismissViewControllerAnimated:YES
completion:nil];
}
else
{
//登陆失败弹出提示信息
UIAlertView *alert = [[UIAlertView
alloc] initWithTitle:@"系统信息"
message:@"用户名或密码错误,请重新输入!"
delegate:nil
cancelButtonTitle:@"取消"
otherButtonTitles:nil,
nil];
[alert show];
}
}
//如果点击了取消按钮,直接返回第一个页面
- (void)cancel
{
[self
dismissViewControllerAnimated:YES
completion:nil];
}
/**
* 添加通知,注意这里设置了附加信息
*/
- (void)postNotification
{
//通知的具体内容
NSDictionary *userInfo =
@{@"loginInfo" : [NSString
stringWithFormat:@"Hello,%@!",_txtUserName.text]};
NSLog(@"%@",userInfo);
//创建一个通知,包括通知的名称/发布者/通知的内容
NSNotification *notificaiton = [NSNotification
notificationWithName:UPDATE_LOGIN_NOTIFICATION
object:self
userInfo:userInfo];
//利用通知中心发布一个通知
[[NSNotificationCenter
defaultCenter] postNotification:notificaiton];
//也可以直接采用下面的方法
// [[NSNotificationCenter defaultCenter]postNotificationName:UPDATE_LOGIN_NOTIFICATION object:self userInfo:userInfo];
}
三、消息中心
对于很多初学者往往会把iOS中的本地通知、推送通知和iOS通知中心的概念弄混。其实二者之间并没有任何关系,事实上它们都不属于一个框架,前者属于UIKit框架,后者属于Foundation框架。
通知中心实际上是iOS程序内部之间的一种消息广播机制,主要为了解决应用程序内部不同对象之间解耦而设计。它是基于观察者模式设计的,不能跨应用程序进程通信,当通知中心接收到消息之后会根据内部的消息转发表,将消息发送给订阅者。下面是一个简单的流程示意图:
了解通知中心需要熟悉NSNotificationCenter和NSNotification两个类:
NSNotificationCenter:是通知系统的中心,用于注册和发送通知,下表列出常用的方法。
方法 | 说明 |
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject | 添加监听,参数: observer:监听者 selector:监听方法(监听者监听到通知后执行的方法) name:监听的通知名称 object:通知的发送者 (如果指定nil则监听任何对象发送的通知) |
- (id <NSObject>)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block | 添加监听,参数: name:监听的通知名称 object:通知的发送者 (如果指定nil则监听任何对象发送的通知) queue:操作队列, 如果制定非主队线程队列则可以异步执行block block:监听到通知后执行的操作 |
- (void)postNotification:(NSNotification *)notification | 发送通知,参数: notification:通知对象 |
- (void)postNotificationName:(NSString *)aName object:(id)anObject | 发送通知,参数: aName:通知名称 anObject:通知发送者 |
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo | 发送通知,参数: aName:通知名称 anObject:通知发送者 aUserInfo:通知参数 |
- (void)removeObserver:(id)observer | 移除监听,参数: observer:监听对象 |
- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject | 移除监听,参数: observer:监听对象 aName:通知名称 anObject:通知发送者 |
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- iOS中的UIKeyboard键盘视图使用方法小结
- 检测iOS设备是否越狱的方法