ios-通知简单示例
通知是一种一对多的信息广播机制,一个应用程序同时只能有一个NSNotificationCenter(通知中心)对象,用来添加通知观察者或者说监听者,以及发送通知.
用的地方是:不同控制器的传值回调.delegate和block也属于一种信息传递机制,但这两种都是一对一的,每次执行的方法都不一样,而通知是一对多,只要有地方触发通知,执行的是同一个方法。
注意点:
- 创建通知中心对象 添加'观察者' observer, 确定通知名字 name,确定监听对象object ,如果object 设置为 nil 则表示监听所有发送名字为 name 的消息. 以及监听到通知(收到通知后)发生的动作 @selector(动作)
- 让消息post 发送者发送通知 名字为在观察者哪里注册的通知名字 name,是字符串类型的.
- a. 最重要的第一点是发布通知的方法中一个是最后的参数userInfo,字典类型,可以将数值传递到@selector(动作) 动作中,动作的参数为NSNotification *notification. notification.userInfo[@"key值"],里面存储了你要传递的数据.
- 最后要在创建观察者的控制器里面dealloc方法中移除通知中心.
下面看示例演示通知在不同控制器中的运作:

上图是两个控制器,分别绑定不同的类.
第一个控制器ViewController.m文件
//
// ViewController.m
// kvo01
//
// Created by 裴波波 on 16/4/4.
// Copyright © 2016年 裴波波. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showMessage:) name:@"show" object:nil];
}
- 在viewDidLoad添加观察者,以及观察者收到通知后触发的方法.设置消息名字.监听对象nil(所有名字为"show"的通知)
//控制器发送名字为 @"show" 的通知的时候都会执行该方法
-(void)showMessage:(NSNotification *)notification {
//弹框
UIAlertController * alertVc = [UIAlertController alertControllerWithTitle:@"操作提示" message:@"这是通知中心" preferredStyle:UIAlertControllerStyleAlert];
//利用userInfo是字典,将需要的数据传递进来,一个是字符串
NSString * str = notification.userInfo[@"haha"];
UIAlertAction * act = [UIAlertAction actionWithTitle:str style:UIAlertActionStyleDefault handler:nil];
[alertVc addAction:act];
//另一个是将触发这个方法的控制器(self)传递进来--->谁发送的 @"show" 通知 触发的这个方法--弹框,就由哪个Vc来弹出这个弹框,而不是用self presentViewController ---这样不对.
[notification.userInfo[@"vc"] presentViewController:alertVc animated:YES completion:nil];
}
- 由于上述方法是弹框的方法所以应该是谁调用这个方法,在谁的控制器里面弹框.所以利用了下面的方法(PBBViewController里面利用userInfo字典将PBBViewcontroller本身传递进来,让self presentViewController 转换成传递进来的PBBViewcontroller).
//移除通知一般在dealloc中
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:[ViewController class] name:@"show" object:nil];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
- 第二个控制的.m文件
//
// PBBViewController.m
// kvo01
//
// Created by 裴波波 on 16/4/4.
// Copyright © 2016年 裴波波. All rights reserved.
//
#import "PBBViewController.h"
@interface PBBViewController ()
@end
@implementation PBBViewController
- (IBAction)clickSendMessageButton:(id)sender {
//获得通知中心对象,发送通知,通知名为在ViewController中注册的通知名 @"show" ,ViewController为观察者,接收通知.接收到通知后出发对应的 @selector(方法) 方法.由于出发的 '方法' 是弹框操作,需要 present 一个controller,而且是谁发送的这个通知,在谁的controller中弹出alertViewController.---通过userInfo字典类型,将对象包装在内部,回传给通知观察者.将调用 present... controller的对象改为传递过去的控制器对象 下面的 @"vc" : (对应的) self ,还可以将弹框的message 改为 @"这是哈哈"
[[NSNotificationCenter defaultCenter] postNotificationName:@"show" object:nil userInfo:@{@"vc":self,@"haha":@"这是哈哈"}];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
- 注意点:postNotificationName此方法中将,需要的控制器传递给ViewController了,以及弹框的message也改成了传递进去的 @"这是哈哈"
能用kvo 以及 block 回调 来传递信息,就不用delegate来传递信息.代理比较繁琐.
ios-通知简单示例的更多相关文章
- iOS上简单推送通知(Push Notification)的实现
iOS上简单推送通知(Push Notification)的实现 根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification ...
- pureMVC简单示例及其原理讲解四(Controller层)
本节将讲述pureMVC示例中的Controller层. Controller层有以下文件组成: AddUserCommand.as DeleteUserCommand.as ModelPrepCom ...
- pureMVC简单示例及其原理讲解三(View层)
本篇说的是View层,即视图层,在本示例中包括两个部分:MXML文件,即可视控件:Mediator. 可视控件 可视控件由UserForm.mxml(图1)和UserList.mxml(图2)两个文件 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- iOS 通知的变化ios9-10,新功能展示
二.新功能展示 1 使用 /iOS通知新功能玩法 2. 全面 iOS10里的通知与推送详情 一.变化 四.Notification(通知) 自从Notification被引入之后,苹果就不断的 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- iOS 通知观察者的被调函数不一定运行在主线程
Tony in iOS | 08/08/2013 iOS 通知观察者的被调函数不一定运行在主线程 今天修复Bug时候发现的一个小细节,记录下. 问题描述 事情是这样的:我在A视图(UITableVie ...
- DotNetty关键概念及简单示例(基于NET5)
DotNetty关键概念及简单示例(基于NET5) 目录 DotNetty关键概念及简单示例(基于NET5) 1.DotNetty 设计的关键 1.1 核心组件 1.1.1 Channel 1.1.2 ...
- iOS通知的整理笔记
iOS通知用于高耦合界面的传值确实方便快捷. 需要实现模态弹出的视图控制器上,有一个视图控制器可以导航.这必定要将这个视图控制器的导航视图控制器naVC.view添加到模态弹出的视图控制器presen ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
随机推荐
- spring mvc超强的json支持,你自己根本不需要额外的配置。spring mvc都给你配置好了!!!
SpringMVC层跟JSon结合,几乎不需要做什么配置,代码实现也相当简洁.再也不用为了组装协议而劳烦辛苦了! 2.一.Spring注解@ResponseBody,@RequestBody和Http ...
- DirectX 基础学习系列6 字体
DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...
- markdown 书写表格
Tables Are Cool col 3 is right-aligned $1600 col 2 is centered $12 zebra stripes are neat $1 Refs ma ...
- session配置理解
session.cache_limiter 指定会话页面所使用的缓冲控制方法,默认为nocache.session.cache_expire 以分钟数指定缓冲的会话页面的存活期,默认为180.此设定对 ...
- foreach遍历 < 创建表 >练习题
原表如下: 效果图如下: <table border="1" width="500" height="260"><tr&g ...
- SqlServer中的一些非常用功能
1.启用双引号作为分隔符 Set Quoted_Identifier on 此时:create table dbo.testcolumn("column" char(2))是合法的 ...
- 【Android测试】【第二节】性能——CPU时间片
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5143192.html 前言 第一节讲CPU的时候留下了一个 ...
- 利用select函数的定时返回功能在Windows上实现微秒级的cpu休眠
说明:在调用该函数前要先调用WSAStartup初始化Winsock void uSleep(uint32_t usec) { struct timeval timeout; fd_set fds; ...
- Windows搭建Cocos2d-JS环境
目录 安装Python Cocos2d-JS框架 开发工具(WebStorm / Cocos Code IDE) 用Webstorm查看官方实例 使用Cocos Code IDE创建工程 1.安装Py ...
- 20145211《Java程序设计》第5周学习总结——独上高楼,望尽天涯路
教材学习内容总结 异常处理 JAVA异常 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.异常就是出现在运行时出现不正常 ...