日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解

發(fā)布時(shí)間:2025/3/8 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

KVC和KVO看起來(lái)很專(zhuān)業(yè),其實(shí)用起來(lái)還是比較簡(jiǎn)單的,KVC(Key-value coding)可以理解為鍵值對(duì)編碼,如果對(duì)象的基本類(lèi)型,那么鍵值對(duì)編碼實(shí)際上和get,set方法沒(méi)有區(qū)別,如果是屬性是另外一個(gè)對(duì)象,那么發(fā)現(xiàn)KVC用起來(lái)還是非常順手,KVO(key-value observing)是鍵值對(duì)的觀察者模式,如果對(duì)象的屬性發(fā)生變更,那么會(huì)觸發(fā)observeValueForKeyPath事件,KVO的這種通知特性讓我們?cè)陂_(kāi)發(fā)的時(shí)候節(jié)省了不必要的代碼,提高了開(kāi)發(fā)效率。

KVC鍵值對(duì)編碼

KVC的操作方法由NSKeyValueCoding協(xié)議提供,NSObject就實(shí)現(xiàn)了這個(gè)協(xié)議,也就是說(shuō)如果對(duì)象是NSObject的子對(duì)象那么就支持KVC操作,KVC有兩種操作方法,一種是設(shè)值,一種是取值,可以理解為getter和setter,不過(guò)稍微有所不同的是,設(shè)置對(duì)象值的方法中有兩個(gè),setValue:屬性值 forKey:屬性名(一般的設(shè)置,比如說(shuō)是說(shuō)設(shè)置NSString,NSNumber等基本類(lèi)類(lèi)型,setetValue:屬性值 forKeyPath:屬性路徑(定義兩個(gè)對(duì)象,Person和Book,Person有一個(gè)類(lèi)型為Book的屬性,如果需要在Person中設(shè)置Book的值,那么可以使用此方法),讀取的也有兩種valueForKey:屬性名、valueForKeyPath:屬性名。

Person.h中的代碼:

//

// Person.h

// BugDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

#import "Book.h"

@interface Person : NSObject

@property (strong,nonatomic) NSString *Name;

@property (strong,nonatomic) Book *Book;

@end

Book.h中的代碼:

//

// Book.h

// BugDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

@interface Book : NSObject

@property (strong,nonatomic) NSString *BookName;

@end

Person中Book屬性的類(lèi)型是Book類(lèi)型,看下主函數(shù)中簡(jiǎn)單調(diào)用:

Person *person=[[Person alloc]init];

[person setValue:@"FlyElephant" forKey:@"Name"];

Book *book=[[Book alloc]init];

person.Book=book;

//路徑設(shè)置

[person setValue:@"天涯明月刀" forKeyPath:@"Book.BookName"];

NSLog(@"%@",[person valueForKey:@"Name"]);

NSLog(@"%@",book.BookName);

NSLog(@"%@",[person valueForKeyPath:@"Book.BookName"]);

NSLog(@"%@",person.Book.BookName);

最終的打印結(jié)果就是FlyElephant和天涯明月刀,需要注意的是一句就是需要先賦值一個(gè)對(duì)象給Person中Book屬性,不然是無(wú)法成功的:

Book *book=[[Book alloc]init];

person.Book=book;

KVO觀察者模式

Key-Value Observing (KVO) 建立在 KVC 之上,能夠觀察一個(gè)對(duì)象的 KVC key path 值的變化,接下來(lái)的做的實(shí)例是在iOS中視圖的ViewDidLoad中實(shí)現(xiàn)的,跟KVC類(lèi)似,不過(guò)可以監(jiān)聽(tīng)值的變化,實(shí)現(xiàn)起來(lái)很簡(jiǎn)單addObserver添加觀察,observeValueForKeyPath觀察變化之后的事件,最后需要銷(xiāo)毀以下監(jiān)聽(tīng)事件,概念就這么簡(jiǎn)單,具體的可以看一下:

新建博主(Blogger)和Article(文章)類(lèi):

Article.h聲明:

//

// Article.h

// KVDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

@interface Article : NSObject

@property (strong,nonatomic) NSString *ArticleName;

@end

Blogger.h代碼:

//

// Bloger.h

// KVDemo

//http://www.cnblogs.com/xiaofeixiang/

// Created by keso on 15/2/8.

// Copyright (c) 2015年 keso. All rights reserved.

//

#import

#import "Article.h"

@interface Blogger : NSObject

@property (strong,nonatomic) NSString *Name;

@property (strong,nonatomic) NSString *Url;

@property (strong,nonatomic) Article *MyArticle;

@end

然后故事板中拖一個(gè)Button和一個(gè)TextField文本框,然后點(diǎn)擊的時(shí)候改變文本框的文字:

首先在ViewDidLoad中添加以下代碼,注意addObserver方法:

_blogger=[[Blogger alloc]init];

//設(shè)置名稱(chēng)

[_blogger setValue:@"FlyElephant" forKey:@"Name"];

//設(shè)置Url

[self.blogger setValue:@"http://www.cnblogs.com/xiaofeixiang" forKey:@"Url"];

//設(shè)置觀察者,options通知的對(duì)象形式

[self.blogger addObserver:self forKeyPath:@"Name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

//設(shè)置文本

[_myTextField setText:[_blogger valueForKey:@"Name"]];

self.Article=[[Article alloc]init];

[self.blogger setValue:self.Article forKey:@"MyArticle"];

[self.blogger setValue:@"KVC和KVO的理解" forKeyPath:@"MyArticle.ArticleName"];

按鈕點(diǎn)擊事件:

- (IBAction)blogObserver:(id)sender {

NSLog(@"blogObserver");

[self.blogger setValue:@"Keso" forKey:@"Name"];

}

OC中要實(shí)現(xiàn)KVO則必須實(shí)現(xiàn)NSKeyValueObServing協(xié)議,不過(guò)NSObject已經(jīng)實(shí)現(xiàn)了該協(xié)議,直接重寫(xiě)observeValueForKeyPath即可:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{

NSLog(@"observeValueForKeyPath");

if ([keyPath isEqualToString:@"Name"]) {

// [_myTextField setText:[_blogger valueForKey:@"Name"]];

[_myTextField setText:_blogger.MyArticle.ArticleName];

}

}

最后銷(xiāo)毀監(jiān)聽(tīng)事件:

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

[self.blogger removeObserver:self forKeyPath:@"Name"];

}

最終實(shí)現(xiàn)效果:

總結(jié)

以上是生活随笔為你收集整理的ios 通过kvc修改属性会触发kvo_iOS开发-KVC和KVO的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。