iOS经典讲解之NSNotification(通知)

iOS开发-NSNotification(消息通知机制) 1.基础概念 iOS的消息通知机制可以在项目中实现不同对象的传值。 发布者需要向通知中心发布通知,观察者(observer)需要向消息通知中心进行注册,在发布者发布通知之后,通知中心就会将该通知再发给观察者。 消息通知机制算是同步的,只有当发布者发布通知之后,观察者才能从通知中心接受到该通知。 消息通知机制可以应用于任意时间和任何对象,发布者发布一个通知,可以有多个观察者接受,所以通知具有... 阅读详情


      通知模式:一个对象能够给其他任意数量的对象广播信息。对象之间可以没有耦合关系。
NSNotification(通知),封装了要广播的信息。 NSNotificationCenter(通知中⼼心),管理注册接收消息对象,广播消息。 observer(观察者),需要监测广播信息的对象,即接收信息的对象。
      接收信息对象在通知中心进行注册,包括:信息名称、接收信息时的处理方法。
对象通过通知中心广播信息,包括:信息名称、信息内容。已经注册过的对象如果不需要接收信息时,在通知中心注销。
通知的核心代码大致三句:包括注册、注销和发送消息。
注册: [[NSNotificationCenter defaultCenter] addObserver:注册对象 selector:@selector(方法名) name:信息名称 object:nil]
注销: [[NSNotificationCenter defaultCenter] removeObserver:注销对象 name:信息名称 object:nil];
发送信息:[[NSNotificationCenter defaultCenter] postNotificationName:信息名称 object:发信息对象 userInfo:发送消息时 传递的信息(是个字典)];

代码示例:

    // 注册一条通知 就是接收方接受参数的
    // [NSNotificationCenter defaultCenter] 通知中心 是个单例类
    // name:@"NOTIFICATIONONE"通知的名字 最好是全大写 做到见名知意
    //selector:收到通知后触发的方法
    //object:发送方对象, 可以写nil,如果写的话发送信息和注册时要一致
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationInfo:) 
name:@"NOTIFICATIONONE" object:@"888"];
 // 销毁通知 名字要和注册时一致
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NOTIFICATIONONE" object:nil];

    // 发送通知
    //postNotificationName:@"NOTIFICATIONONE" 通知的名字 必须和注册时一样 否则接收不到
    //userInfo:(NSDictionary *)携带的参数 是个字典
    //object:@"888"必须和注册通知时一致 或者注册时不填
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATIONONE" object:@"888" 
userInfo:@{@"UI":@"Over"}];

下面通过一个例子了解通知的用法:(通过通知来完成简单的换肤效果)

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 100, 100);
    button.backgroundColor = [UIColor blueColor];
    [button setTitle:@"按钮" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(actionButton:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
    
    
    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    button1.frame = CGRectMake(100, 250, 100, 100);
    button1.backgroundColor = [UIColor blueColor];
    [button1 setTitle:@"按钮" forState:UIControlStateNormal];
    [button1 addTarget:self action:@selector(actionButton1:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];
}

// 发送通知
- (void)actionButton:(UIButton *)button
{
    //postNotificationName:@"NOTIFICATIONONE" 通知的名字 必须和注册时一样 否则接收不到
    //userInfo:(NSDictionary *)携带的参数 是个字典
    //object:@"888"必须和注册通知时一致 或者注册时不填
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATIONONE" object:@"888" 
userInfo:@{@"UI":@"Over"}];
    
}

// 发送通知
- (void)actionButton1:(UIButton *)button
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"CHANGEBARCOLORGREEN" object:nil
 userInfo:nil];
}


@end 





<span style="font-size:14px;">@implementation AppDelegate

-(void)dealloc
{
    // 销毁通知
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"NOTIFICATIONONE" object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"CHANGEBARCOLORGREEN" object:nil];
    [_window release];
    [super dealloc];
}


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    
    // 注册通知1 改红色
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationInfo:) name:@"NOTIFICATIONONE" object:@"888"];
    
    // 注册通知2 改绿色
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationInfo:) name:@"CHANGEBARCOLORGREEN" object:nil];
    
    
    RootTabBarController *rootVC = [[RootTabBarController alloc] init];
    self.window.rootViewController = rootVC;
    [rootVC release];
    
    
    return YES;
}

//实现接收通知的方法
- (void)notificationInfo:(NSNotification *)notification
{
       // 通过通知的名字来判断发送的对应的通知 也可以注册时用不同的方法 
     if ([notification.name isEqualToString:@"NOTIFICATIONONE"]) {
        
        // 1、把rootVC取出来(window的根视图控制器)
        UIViewController *vc = self.window.rootViewController;
        // 2、把已经设置的window的rootVC 重置为空
        self.window.rootViewController = nil;
        // 3、设置皮肤
        // 取出NavBar 和 TabBar
        // 通过调用appearance 取出要更改的 bar
        UINavigationBar *navBar = [UINavigationBar appearance];
        [navBar setBarTintColor:[UIColor redColor]];
        UITabBar *tabBar = [UITabBar appearance];
        [tabBar setBarTintColor:[UIColor redColor]];
        // 4、重新赋值 window的根视图控制器
        self.window.rootViewController = vc;
        
    } else if ([notification.name isEqualToString:@"CHANGEBARCOLORGREEN"]) {
        
        UIViewController *vc = self.window.rootViewController;
        self.window.rootViewController = nil;
        UINavigationBar *navBar = [UINavigationBar appearance];
        [navBar setBarTintColor:[UIColor greenColor]];
        UITabBar *tabBar = [UITabBar appearance];
        [tabBar setBarTintColor:[UIColor greenColor]];
        self.window.rootViewController = vc;
        
    }
    
}

@end
</span>



iOS雨笙 NSNotification通知模式的原理及实现 NSNotification(通知模式),是界面间通信的一种方式. 这种模式的实现,是通过某一个界面去发送通知,其它任意数量的对象只要遵循某一种原则,都可以接收到这个通知消息.即使这些对象之间没有耦合关系. 用得到NSNotification(通知)的地方不是太多,比较常用的一种场景是"换皮肤",就是更换UITabBar,UINavigationBar的背景,以达到换肤的效果(下面会代码举例) 阅读详情

相关推荐

IOS通知的详解

1、为什么要使用通知使用 Notifications 用户可能使用一个软件并打开了几个document, 然后他发现紫色的背景颜色实在是不利于阅读文档正文. 于是,他打开Preferences修改背景颜色,不过令人失望的是,已经存在的文档的背景颜色不会跟着改变. 于是,这个用户可能会写信给你告诉你这些. 你也许会回复:”defualts会在document创建的时候

潇小溅 iOS技术专栏 627

NSNotification

一、概述 NSNotification顾名思义就是通知的作用,一个对象通知另外一个对象,可以用来传递参数、通信等作用,与delegate的一对一不同,通知是多对多的。在一个对象中注册了通知,那么其他任意对象都可以来对这个对象发出通知。   二、NSNotificationCenter 每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协

于海明的博客 714

iOS NSNotificationCenter与自定义通知的封装(PSSNotificationCenter)

前言 作为iOS开发者,大家应该都使用过系统通知(NSNotificationCenter),无非就是三步,1. 注册通知,2.发送通知,3.销毁观察者,我在这里就不多解释了;。如果忘记销毁观察者,ios9之前是会崩溃的。因此我就有了自己实现全局一对多分发通知的想法,于是封装了PSSNotificationCenter 系统通知如何使用 通知的使用为3步: 注册通知 [[NSNotific...

pangshishan1的博客 1472

iOS 通知(NSNotification)的简单使用

通知:NSNotification,是iOS开发中一种重要的设计模式,它的实质是程序内部提供的一种广播机制。把接受到的消息根据内部消息转发表,将消息转发给需要的对象。 通知这种设计模式,在开发中常用来不同类之间的通信,也就是常说的页面之间的传值。当然它不仅仅只有这一种应用场景,还有一种常用场景是用来控制一些属性或者控件,使得这些属性或控件在不同情况下发生响应的变化。在我以前的一个项目中就有这样的...

m0_37681833的博客 2万+

NSNotificationCenter 通知使用方法详解

你要知道的KVC、KVO、Delegate、Notification都在这里转载请注明出处 http://www.jianshu.com/p/f6224f075437本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。 KVC 使

什么都不会的小菜鸟 1万+

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1382

iOS NSNotificationCenter简介

NSNotificationCenter通知是一种消息广播的实现机制,可以在不同对象之间发送通知进而实现通信。

假装你是大灰狼的专栏 1423

Cadence Allegro 17.4 保姆级教程:PCB位号重排与反标回原理图完整避坑指南

本文详细解析了Cadence Allegro 17.4中PCB位号重排与反标回原理图的全流程,包括安全工程准备、智能重排策略和反标黄金法则。特别针对芯片封装协同设计(Co-Design)场景,提供可追溯的版本管理和故障恢复方案,帮助工程师避免常见位号陷阱,确保设计文件一致性。

weixin_30613433的博客 441

消息通知的三种方式总结

通知允许我们在低程度耦合的情况下,满足控制器与一个任意的对象进行通信的目的。 这种模式的基本特征是为了让其他的对象能够接收到某种事件传递过来的通知,主要使用通知名称来发送和接收通知。当两个子系统有直接关系,可以考虑闭包、代理等方法传值,单如果两个子系统是独立的,没有耦合关系,此时,就需要另一种形式,通知 Notification.通知的优势和缺点优势: 不需要编写多少代码,实现比较简单; 对于一个发

黄飞的博客专栏 1万+

深度学习与神经网络有什么区别

人工神经网络(ArtificialNeuralNetwork,即ANN)是从信息处理角度对人脑神经元网络进行抽象,是20世纪80年代以来人工智能领域兴起的研究热点,其本质是一种运算模型,由大量的节点(或称神经元)之间相互联接构成,在模式识别、智能机器人、自动控制、生物、医学、经济等领域已成功地解决了许多现代计算机难以解决的实际问题,表现出了良好的智能特性。...

super67269的博客 8488

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

iOS开发-通知NSNotification

1.NSNotification:消息或通知 有三个成员变量 - (NSString *)name; - (id)object; - (NSDictionary *)userInfo; 通知名称:name, 消息发送者:object,代理在收到NSNotification方法里,可以回调到object 附加信息:userInfo   2.NSN

努力-奋斗 1865

华为OD机试真题 新系统【查找能被整除的最大整数】

华为OD新系统机试真题【查找能被整除的最大整数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找能被整除的最大整数】

qq_45776114的博客 673

NSNotification 通知

在IOS中,每一个运行中的程序都有个NSNotificationCenter(通知中心)成员变量。如果有对象需要关注某一个NSNotification(通知), 首先去通知中心注册 [[NSNotificationCenter defaultCenter] addObserver...

121

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8802

使用 Python 爬虫获取中国证券市场公司公告数据

本文详细介绍了如何使用 Python 爬虫技术从中国证券市场(如巨潮资讯网)爬取公司公告数据。通过分析网页结构,编写爬虫脚本,抓取并存储公告信息,我们实现了从网页抓取数据的全过程。此外,本文还展示了如何应对反爬虫机制,并介绍了数据分析与可视化的基本方法。未来,我们可以通过机器学习等技术进一步挖掘公告中的潜在信息,例如,通过情感分析对公告内容进行情绪分类,或者预测某些公告类型对股市走势的影响等。希望本文能帮助你理解如何使用 Python 爬虫技术获取和处理证券市场的数据,并为你的数据分析项目提供帮助。

2201_76125261的博客 1887

【Swift通知使用全攻略】:掌握iOS开发中NSNotification的5大核心技巧

掌握Swift通知用法,轻松实现iOS应用中的消息传递。详解NSNotification在页面通信、状态更新等场景的5大核心技巧,涵盖 addObserver、postNotificationName 等关键方法,提升代码解耦与响应效率。实用指南值得收藏。

PixelFlow的博客 741

上位机图像处理和嵌入式模块部署(qmacvisual获取边界点)

【声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 在图像处理中,解决了分割的问题之后,下面就是属性信息的提取。在这其中,有一种属性是非常重要的 ,那就是外界轮廓的边界点获取。这个边界点,可以用来计算长度,也可以用来进行直线、圆的拟合,具体的用途取决于现场的实际使用场景。目前qmacvisual支持对边界点的提取,相关控件可以直接用来提取边界点。

嵌入式-老费,一个分享专业嵌入式知识的blog 883

【iOS】——通知机制及底层原理

注册通知在同步通知中存储是以name和object为维度的,即判定是不是同一个通知要从name和object区分,如果他们都相同则认为是同一个通知,后面包括查找逻辑、删除逻辑都是以这两个为维度的。通过name和object将通知存储划分为三种结构:named表(name存在)、nameless表(name不存在)、wildcard链表(name和object都不存在)在通知的存储过程并没有做去重操作,这也解释了为什么同一个通知注册多次则响应多次。

m0_73974920的博客 1955

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

OC笔记 - NSNotification、键盘通知(2015.3.7)

1.UITextField 通过UITextField的代理方法能够监听键盘最右下角按钮的点击 成为UITextField的代理 self.textField.delegate= self;   遵守UITextFieldDelegate协议,实现代理方法 - (BOOL)textFieldShouldReturn:(UITextField *)textField;   在UIT

xiaojian3322的专栏 1000

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

iOS开发中的推送通知的讲解

在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情。iOS中通知机制又叫消息机制,其包括两类:一类是本地通知;另一类是推送通知,也叫远程通知。两种通知在iOS中的表现一致,可以通过横幅或者弹出提醒两种形式告诉用户,并且点击通知可以会打开应用程序,但是实现原理却完全不同。今天就和大家一块去看一下如何在iOS中实现

喵咪不爱吃鱼的博客 1112

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iOS开发学习专题-基础知识(五) NSDate时间 NSUserDefaults本地存储 NSNotification系统通知的详细使用方式

本文主要讲解的是 NSDate时间、NSUserDefaults本地存储、NSNotification系统通知的详细使用方式,也是NS系列基础知识的最后一篇文章 文章是博主原创,转载请标明出处 NSUserDefaults是iOS系统提供的一个单例类(iOS提供了若干个单例类),通过类方法standardUserDefaults可以获取NSUserDefaults单例。 NSUserDefa

伪随机的张三 2561

iOS NSNotificationCenter 接收不到通知消息

作者:Gintok 链接:https://www.jianshu.com/p/e368a18ca7c2 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 通知的使用 NSNotificationCenter通知中心是iOS程序内部的一种消息广播的实现机制,可以在不同对象之间发送通知进而实现通信,通知中心采用的是一对多的方式,一个对象发送的通知可以被多个对象...

Lee优快云77的博客 2877

iOS通知机制

iOS通知机制 1. 定义一个方法 -(void) update{ } 2. 对象注册,并关连消息 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(update) name:@"update" object:nil] 3. 在要发出通知消息的地方 [[NSNotificati...

aaa1231722的博客 123

IOS开发中如何使用通知NSNotification传值

通知 是在跳转控制器之间常用的传值代理方式,除了代理模式,通知更方便、便捷,一个简单的Demo实现通知的跳转传值. 输入所要发送的信息 ,同时将label的值通过button方法调用传递, - (IBAction)buttonClick:(id)sender { //添加字典,将label的值通过key值设置传递 NSDictionary*dict =...

aibiao0099的博客 132

iOS KVO、通知、代理

KVO(键值监听) iOS推荐的设计模式是MVC,Model View Controller。KVO和下面的通知用于Model和Controller之间通信,(在MVC中,Model和Controller不能通信). KVO机制由NSKeyValueObserving协议提供支持,NSObject遵守了该协议,所有OC的类都可以使用协议中的方法,里面的方法有: addObserver:<#(...

wtl1804的博客 309
上一篇: iOS经典讲解之线程锁NSLock案例(卖火车票)
下一篇: iOS经典讲解之Objective-C内存管理基础知识及内存管理黄金原则
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值