ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别

一、Delegate

Delegate本质是一种程序设计模型,iOS中使用Delegate主要用于两个页面之间的数据传递。iphone中常用@protocol和delegate的机制来实现接口的功能。例如想在A的功能要在B中实现,可以在A中定义一个Protocol。

protocol用法:

@interface ClassA :ClassB<protocol1, protocol2>

1、首先声明一个UIView类:

@interface myView  :UIView{  }

@end;

2、声明一个protocol,前缀为protocol :

@protocol myViewDelegate

-(void) Fun1;

-(void) Fun2;

@end;

3、之后就是代理委托人,委托的声明方式如下,我们要在ClassB内使用Fun1方法,但是不需要做声明:

@interface ClassB :UIViewController<myViewDelegate>

@end

4、ClassB实现:

@implement ClassB

-init{

MyView *view = [[MyView alloc]init];

view.delegate = self;

self.view = view;

}

-(void)Fun1{

}

@end

如果要在ClassA中使用Fun1,需要在ClassA的声明中添加:

@interface myView  :UIView{

id<myViewDelegate> delegate;

}

@property ...

@end

具体实现中时:

-(void)action{

[delegate Fun1];

}

二、NSNotification

NSNotification是用来在类之间传递消息参数的。每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏。

对象注册关注某个确定的notification(比如说老师通知今天上午课取消). 我们把这些注册对象叫做 observer. 其它的一些对象会给center发送notifications(今天上午课取消). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster。

具体使用方法有四个步骤:

1、定义一个事件到来时该执行的方法

1 - (void)stopClass:(NSNotification*)notification{
2
3 //今天不上课
4
5 }

2、注册观察者

参数介绍:

addObserver: 观察者,即在什么地方接收通知;

selector: 收到通知后调用何种方法;

name: 通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的;

object:传递的参数

1     [[NSNotificationCenter defaultCenter] addObserver:self
2                                              selector:@selector(stopClass:)
3                                                  name:@"NotoficationName"
4                                                object:nil];

3、激发事件,即通知相应的观察者

1 [[NSNotificationCenter defaultCenter] postNotificationName:@"NotoficationName"
2                                                         object:nil];

代码到这里,- (void)stopClass:(NSNotification*)notification方法就会执行了;事件只会在当前的 NotificationCenter 中广播,不同的 NotificationCenter 之间的事件通知互不相干(就像上面的例子,今天上午课取消只是针对我班,不影响别班)

4、移除通知;(最后,你的观察者如果对一些事件没兴趣了,应该从 NotificationCenter 中移除掉)

1 //与注册时相同
2     [[NSNotificationCenter defaultCenter] removeObserver:self
3                                                     name:@"NotoficationName"
4                                                   object:nil];
5     //或者
6     [[NSNotificationCenter defaultCenter] removeObserver:self];

三、KVO

KVO,全称为Key-Value Observing,是iOS中的一种设计模式。用于检测对象的某些属性的实时变化情况并作出响应,即当指定的对象的属性被修改后,则对象就会接受到通知,简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。与NSNotification相比之下KVO更加简洁而直接。

KVO的使用也很简单,就是简单的3步:
      1.注册需要观察的对象的属性addObserver:forKeyPath:options:context:
      2.实现observeValueForKeyPath:ofObject:change:context:方法,这个方法当观察的属性变化时会自动调用
      3.取消注册观察removeObserver:forKeyPath:context:

实例:假设我在双十一之前看中一件衣服,双十一衣服价格会有变动,我需要监听衣服的价格变动。

1、定义一个Model

1 @interface DataModel:NSObject (){
2     DataModel *shirtForKVO;
3     UILabel *myLabel;
4     UIButton *myButton;
5
6     NSString *shirt;
7     float price;
8
9 }

2、实例化

 1 - (void)viewDidLoad {
 2
 3     shirtForKVO = [[DataModel alloc] init];
 4     [shirtForKVO setValue:@"myShirt" forKey:@"shirt"];
 5     [shirtForKVO setValue:@"150.0" forKey:@"price"];
 6     [shirtForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
 7
 8     myLabel = [[UILabel alloc] initWithFrame:(CGRect){0,100,200,50}];
 9     myLabel.text = [shirtForKVO valueForKey:@"price"];
10     myLabel.textColor = [UIColor orangeColor];
11     [self.view addSubview:myLabel];
12
13     myButton = [[UIButton alloc] initWithFrame:(CGRect){0,20,50,30}];
14     myButton.backgroundColor = [UIColor purpleColor];
15     [myButton addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside];
16     [self.view addSubview:myButton];
17
18
19 }

3、当点击button的时候,调用buttonAction方法,修改对象的属性

1 - (void)buttonAction{
2
3     [shirtForKVO setValue:@"100.0" forKey:@"price"];
4
5 }

4、实现回调方法

1 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
2
3     if ([keyPath isEqualToString:@"price"]) {
4         myLabel.text = [shirtForKVO valueForKey:@"price"];
5     }
6
7 }

5、移除观察者

1 - (void)dealloc{
2
3     [shirtForKVO removeObserver:self forKeyPath:@"price"];
4
5 }

四、Delegate 、NSNotification 、KVO之间的联系及其区别

区别:

delegate方法往往需要关注返回值, 也就是delegate方法的结果。

delegate只是一对一,而NSNotification、KVO可以一对多,两者都没有返回值。

各自特点:

NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会帮你检错和补全,所以比较容易出错。

delegate方法最典型的特征是往往需要关注返回值。

时间: 2024-12-04 23:48:16

ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别的相关文章

ios基础篇(八)——UITabBarController的简单介绍

一.简介 UITabBarController和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换,典型的例子就是QQ.微信.微博等应?. 二.UITabBarController的使用 1.首先初始化UITabBarController 2.设置UIWindow的rootViewController为UITabBarController 3.创建相应的子控制器(viewcontroller) 4.把子控制器

ios基础篇(二)——UIImageView的常见用法

UIImageView是在界面上显示图片的一个控件,在UIImageView中显示图片的话应该首先把图片加载到UIImage中,然后通过其他方式使用该UIImage. 创建UIImageView有两种方法: 一种是用UIImage来加载:UIImage *image = [UIImageimageNamed:@"picture"];UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 另一种是通过init

从零开始学ios开发(十八):Storyboards(下)

这篇我们完成Storyboards的最后一个例子,之前的例子中没有view之间的切换,这篇加上这个功能,使Storyboards的功能完整呈现.在Storyboards中负责view切换的东西叫做“segue”,只需对它进行简单的设置即可,一切都是傻瓜式的,无需繁琐的代码.好了,开始我们的例子吧. 1)Create a Simple Storyboard创建一个project,左边选择Application,右边选择Empty Application template(我们这里不使用Single

Bootstrap &lt;基础二十八&gt;列表组

列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 class .list-group-item. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 基本的列表组</title> <link href="/boo

iOS基础篇(十五)——UIScrollView的基本用法

滚动视图(UIScrollView)通常用于显示内容尺寸大于屏幕尺寸的视图. 一.基本属性 1.CGSize contentSize :设置UIScrollView的滚动范围 2.CGPoint contentOffset :UIScrollView当前滚动的位置 3.UIEdgeInsets contentInset :设置内容的边缘 4.BOOL bounces 当超出边界时表示是否可以反弹 5.BOOL scrollEnabled 是否能滚动 6.BOOL showsHorizontalS

iOs基础篇(二十二)—— UIPickerView、UIDatePicker控件的使用

一.UIPickerView UIPickerView是一个选择器控件,可以生成单列的选择器,也可生成多列的选择器,而且开发者完全可以自定义选择项的外观,因此用法非常灵活. 1.常用属性 (1)numberOfComponents:获取UIPickerView指定列中包含的列表项的数量. (2)showsSelectionIndicator:控制是否显示UIPickerView中的选中标记(以高亮背景作为选中标记). 2.常见方法 (1)- (NSInteger)numberOfComponen

ios基础篇(十)——UINavgationController的使用(一)UIBarButtonItem的添加

UINavigationController又被成为导航控制器,继承自UIViewController,以栈的方式管理所控制的视图控制器,下面就详细说一下UINavigationController的使用: 1.首先新建一个工程(就不多说了)创建RootViewController(继承自UIViewController). 2.打开AppDelegate.h文件添加属性 3.打开AppDelegate.m文件的 - (BOOL)application:(UIApplication *)appl

ios基础篇(三十)—— AFNetworking的使用

一.AFNetworking的创建 新建工程,命名为AFNDemo 二.导入AFNetworking.h AFNetworking文件下载:https://github.com/AFNetworking/AFNetworking 在ViewController.m中导入AFNetworking.h #import "ViewController.h" #import "AFNetworking.h" 1.创建一个下载任务(官方网站上给出的例子) NSURLSessi

ios基础篇(十二)——UINavgationController的使用(三)ToolBar

UIToolBar存在于UINavigationController导航栏控制器中,而且默认被隐藏:设置UINavigationController的toolbarHidden属性可显示UIToolBar. 一.UIToolBar的设置 1.在RootViewController.m的viewDidLoad方法中添加代码: [self.navigationController setToolbarHidden:NO animated:YES]; 如图:显示底部ToolBar 2.设置UITool