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 ...
随机推荐
- MySQL 授权远程登录(Ubuntu 环境)
环境:Ubuntu 13.10 (GNU/Linux 3.11.0-12-generic i686) 在用 Navicat 连接远程数据库时报错: ERROR (HY000): Host *** is ...
- 超实用PHP函数总结整理
超实用PHP函数总结整理 2014-12-06 分类:WEB开发.编程开发.首页精华暂无人评论 来源:月光光博客 分享到:更多8 1.PHP加密解密 PHP加密和解密函数可以用来加密一些 ...
- 【IOS笔记】Using View Controllers in Your App
参考:http://www.cnblogs.com/patientAndPersist/p/3279645.html Using View Controllers in Your App Whethe ...
- JavaScript函数参数与调用
函数调用: /* 1. 函数调用 */ ,,,); /* 2. 方法调用 */ this.CName = "全局"; var o = { CName:"o类", ...
- freebsd 显示中文
来自 :http://francs3.blog.163.com/blog/static/405767272014659311700/ 只需在 ~/.cshrc 文件添加以下几行即可. --3 在~/. ...
- 理解tornado
计算密集型:多进程 IO密集型:多线程 能产生IO阻塞的情况很多,比如网络通讯.磁盘读写.当发生阻塞时,CPU是闲置的,此时如果就一个线程就没法处理其他事情了. 所以对于含有IO阻塞的环境,多线程 ...
- 【Android测试】【随笔】Bugtags初体验
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5410003.html 前言 早晨接到一个临时任务,就是尝试 ...
- C#5.0 .net 4.5示例
//filename: MathOperations.cs using System; using System.Collections.Generic; using System.Linq; usi ...
- MyBatis3资料网址
官网: http://mybatis.github.io/mybatis-3/zh/index.html 资料: http://www.open-open.com/doc/list/112?o=d 整 ...
- angularJS的$watch和$apply
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...