不同页面间的通知

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程序内部之间的一种消息广播机制,主要为了解决应用程序内部不同对象之间解耦而设计。它是基于观察者模式设计的,不能跨应用程序进程通信,当通知中心接收到消息之后会根据内部的消息转发表,将消息发送给订阅者。下面是一个简单的流程示意图:

了解通知中心需要熟悉NSNotificationCenterNSNotification两个类:

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代表通知的附加信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值