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 ...
随机推荐
- Ubuntu下关闭apache和mysql的开机启动
Ubuntu下关闭apache和mysql的开机启动 sudo apt-get install sysv-rc-conf sudo sysv-rc-conf sudo vi /etc/init/mys ...
- UITextField里面的 placeholder颜色和字体
// placeholder 颜色 [field setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor& ...
- 做bbs论坛项目的收获(1)
1. 当两张表出现关联的时候,关联的外键,千万不能是汉字,千万不能使汉字,因为这个问题,直接导致项目进行不下去..... 顺便记录一下知识点(一) 当用frameset设置网页的结构的时候 eg: & ...
- 随机(Random)
随机(Random)随机是智能的基础,人工智能的很多技术都需要用到随机,因此有必要把这个提到前面谈谈一考虑基于C/C++,般我们都是使用的rand ()等函数实现随机,当然我们也有吊炸天的boost库 ...
- WPF 最大化最小化窗口
public static void FullOrMin(this Window window) { //如果是全屏,则最小化 if (win ...
- laravel elixir
npm install npm install jquery --save //bootsrap3.36 与 jquery3不兼容,下载jquery时可能需要确定版本号 npm install jqu ...
- 不遗留问题-menu数据拼装-2
$res = array(); foreach($idlist_1 as $id1) { $tmp = array(); $tmp1 = array(); $tmp1[] = $id1; foreac ...
- 浅析C++的内存管理
在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/ 静态存储区和常量存储区. 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参 ...
- Ubuntu/Deepin下常用软件汇总(持续更新)
最近开始用Ubuntu了,好多软件都不是常用的了,在这边留底,以免忘记.如果没有写安装方法,则直接在软件源中可以找到 UNetbootin U盘制作工具,制作Ubuntu的安装U盘超好用 Braser ...
- UML 关系
1. 关联关系(association) 关联关系式是用一条直线表示的,如A—B.表示在一段时间内将多个类的实例连接在一起,关联关系描述了某个对象在一段时间内一直知道另一个对象的存在.在Rose中为了 ...