您的位置:首页 > 移动开发 > IOS开发

不同页面间的通知

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:是通知系统的中心,用于注册和发送通知,下表列出常用的方法。
方法
说明
-       (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:通知发送者
NSNotification:代表通知内容的载体,主要有三个属性:name代表通知名称,object代表通知的发送者,userInfo代表通知的附加信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 通知