问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

iOS 的 NSNotificationCenter 中哪些通知由系统自动发送?

发布网友 发布时间:2022-05-07 03:48

我来回答

2个回答

热心网友 时间:2023-10-14 09:37

NSNotificationCenter消息通信机制介绍(KVO) 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的.
NSNotificationCenter消息通信机制介绍(KVO)
作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的.
注册通知:即要在什么地方接受消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];
参数介绍:
addObserver: 观察者,即在什么地方接收通知;
  selector: 收到通知后调用何种方法;
  name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:调用观察者处的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@"mytest" object:searchFriendArray];
参数:
postNotificationName:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
object:传递的参数
注册方法的写法:
- (void) mytest:(NSNotification*) notification
{
id obj = [notification object];//获取到传递的对象
}

附:注册键盘升启关闭消息
//键盘升起 [[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification object:nil];//键盘降下[[NSNotificationCenter
defaultCenter] addObserver:self selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification object:nil];
看一个程序,里面viewDidLoad中有
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"saveMessage" object:nil];
[center addObserver:self selector:@selector(saveMessage) name:@"saveMessage" object:nil];

不明白为什么先去掉注册者,然后又添加?不是同一个observer吗?
消息传送机构:举例说明

在有需要的类中,发送消息
//发送消息出去,这里的对象是一个数组:saveImageArray
[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];

所有亲朋好友给我给包(发送消息),,,

//注册一个observer来响应消息的传送
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PostImage:)//接收消息方法
name:@"postData"//消息识别名称
object:nil];

举个例子,过年了,准备一个大的钱包(注册一个OBserver),嘿嘿,,,,

//实现方法
-(void)PostImage:(NSArray *)array
{
//接收传送过来的消息
}

我把红包都收起来,(接收消息)

//移除observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];
红包都收完了,哈哈,亲朋好友回家咯。。

简单说明,哈哈,不需要理解太复杂。。。。

例说明:KVC用来传送消息,是很不错的。

//kvo注册以parserDatas为例说明:parserDatas是一个解析XML的类
[parserDatas addObserver:self
forKeyPath:@"isFinished" options:(NSKeyValueObservingOptionNew |
NSKeyValueObservingOptionOld) context:parserDatas];

//接收变更通知
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{

if ([keyPath isEqual:@"isFinished"]) {
BOOL isFinished=[[change objectForKey:NSKeyValueChangeNewKey] intValue];
if (isFinished) {//如果服务器数据接收完毕

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:parserDatas.parsedDataArray];
//保存数据
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSString *path = [DOCUMENT_PATH stringByAppendingPathComponent:@"AllXmlDataArray.bin"];
[NSKeyedArchiver archiveRootObject:array toFile:path];
[array release];
//取消kvo注册
[object removeObserver:self
forKeyPath:@"isFinished"];
}
}else{
// be sure to call the super implementation
// if the superclass implements it
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}

在parserDatas类中定义:

+ (BOOL):(NSString*)key
{
//当这两个值改变时,使用自动通知已注册过的观察者,观察者需要实现observeValueForKeyPath:ofObject:change:context:方法
if ([key isEqualToString:@"isFinished"])
{
return YES;
}
return [super automaticallyNotifiesObserversForKey:key];
}

发送变更通知:

在需要跟踪消息记录的函数中加入:
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isFinished"];

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"saveMessage" object:nil];

不用的时候,才注销掉的。。

一般放在dealloc....里面。

在用之前把notification注册掉,是为了防止多次注册,这一般是因为这个view在程序运行时要load很多次,比如Three20
的非顶层的View每次显示的时候都重新load,这样如果不在用之前把notification注册掉,就会重复注册消息,比如每次接收到消息就打印一
句话,当你打开了n次这个view的时候,这句话就会打印n次...

- (void)awakeFromNib{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(switchViews:)
name:@"switchViews"
object:nil];
}

- (void)switchViews:(NSNotification*)notification{
NSNumber *viewNumber = [notification object];
NSInteger i = [viewNumber integerValue];
[self setSelectedSegmentIndex:i];
UIView *chosenView = nil;
switch (i) {
case 0:
chosenView = view1;
break;
case 1:
chosenView = view2;
break;
case 2:
chosenView = view3;
break;
default:
break;
}
if (chosenView) {
[[viewController view] bringSubviewToFront:chosenView];
}
}

- (void)dealloc{
[super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end

热心网友 时间:2023-10-14 09:37

首先,这两个东西不在同一个框架中,
NSNotificationCenter在 /System/Library/Frameworks/Foundation.framework 是支持MacOS的
而 UILocalNotification 在 /System/Library/Frameworks/UIKit.framework iOS可用
UILocalNotification可以理解为RemoteNotification的一个Local实现,是一个面向UI的(支持Alert,Sound等)的通知机制。用途例如,定时器,当计时结束,就发一个通知,然后弹出提示。
NSNotificationCenter是一个面向事件通知中心,他的原理是,你注册一个通知事件到defaultCenter,这个事件的标示符就是 myName,当有一个myName的通知被Post到通知中心,那么所有生命周期中的myFunc:都会被执行。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
硅胶与液态硅胶手机壳的区别 什么样的过敏会传染 过敏的原理是什么?为什么有的人过敏,有的人不过敏?谢谢! 过敏为什么会痒 评审报告需要注意什么 财政评审流程及注意事项 高效项目评审的6大注意事项 银行双录 什么意思 什么是银行双录 在异地哪些可公证 ios cgcontext怎么重新绘制 ios 中怎么创建jsoncontext对象 ios jscontext 会存在多个么 学习通超星课堂在哪 ios中”上下文”是什么概念 ios通知发送后在创建接受者还能收到这个通知吗 iOS里像CGContextRef这样以Ref结尾的是基于什么原理 女性围度正确测量图 ios 添加观察者 context填写什么 ,,,谢谢 context什么意思 名侦探柯南中黑衣组织,FBI,,CIA,工藤新一,服部平次,怪盗基德的出场集数 压力变送器通过485的端口连接到电脑,怎样校正~~?? 求柯南动画黑衣人相关 《名侦探柯南》里面哪几级比较好看?重金求……!!! 20分跪求与海贼王剧场版第8部相符合的TV版是从哪里开始的? 跪求《盟军敢死队1使命的召唤》全攻略 欠货款跑路可以报警吗 你好问一下出风口不出风怎么回事 驾驶室空调出风口不出风 有视频剪辑要求的大学生什么笔记本电脑比较 ios webview在什么时候创建js context ios实现颜色渐变的几种方法 ios开发中怎样利用cgcontext将一个uiimage对象从一个uiview上面移除掉... 东北烧烤怎么样? 东北人烤肉怎么样 男人吃什么可以补肾? 东北烧烤是全国最佳吗 亡的部首和组词 我是xp系统,宽带无法连接错误678怎么解决,求大神! 亡的部首是什么? 电脑是WindowsXP,但宽带连接连不上,显示678错误,用电脑管家分析发现DNS 我家宽带连不上 错误代码678是什么意思 xp宽带连接显示678怎么办? 怎么解决宽带连接错误678? XP系统宽带怎么连接不上老是说错误678 华夏信用卡三万逾期五年利息多少 电脑宽带连接时,显示错误678,怎么办? XP了宽带连接提示678 本地连接成功,可以上网但是宽带连接错误678 电脑宽带连接不上,错误代码678.找不到netcfg.hlp文件.怎么回事?