鍵值編碼KVC
可以利用字符串的方式去動(dòng)態(tài)控制一個(gè)對(duì)象。其實(shí)由于OC的語(yǔ)言特性,你根部不必進(jìn)行任何操作就可以進(jìn)行屬性的動(dòng)態(tài)讀寫,這種方式就是Key Value Coding(簡(jiǎn)稱KVC)。
KVC的操作方法由NSKeyValueCoding協(xié)議提供,而NSObject就實(shí)現(xiàn)了這個(gè)協(xié)議,也就是說(shuō)ObjC中幾乎所有的對(duì)象都支持KVC操作,常用的KVC操作方法如下:
動(dòng)態(tài)設(shè)置:
- setValue:屬性值 forKey:key(屬性名)(用于簡(jiǎn)單路徑)
- setValue:屬性值 forKeyPath:key(屬性路徑) (用于復(fù)合路徑,例如Person有一個(gè)Account類型的屬性,那么person.account就是一個(gè)復(fù)合屬性)
動(dòng)態(tài)讀取:
- valueForKey:屬性名
- valueForKeyPath:屬性名(用于復(fù)合路徑)
注意:
- key的值必須正確,如果拼寫錯(cuò)誤,會(huì)出現(xiàn)異常
- 當(dāng)key的值是沒(méi)有定義的,valueForUndefinedKey:這個(gè)方法會(huì)被調(diào)用,如果你自己寫了這個(gè)方法,key的值出錯(cuò)就會(huì)調(diào)用到這里來(lái)
- 因?yàn)轭恔ey反復(fù)嵌套,所以有個(gè)keyPath的概念,keyPath就是用.號(hào)來(lái)把一個(gè)一個(gè)key鏈接起來(lái),這樣就可以根據(jù)這個(gè)路徑訪問(wèn)下去
鍵值監(jiān)聽(tīng)KVO
KVO其實(shí)是一種觀察者模式,利用它可以很容易實(shí)現(xiàn)視圖組件和數(shù)據(jù)模型的分離,當(dāng)數(shù)據(jù)模型的屬性值改變之后作為監(jiān)聽(tīng)器的視圖組件就會(huì)被激發(fā),激發(fā)時(shí)就會(huì)回調(diào)監(jiān)聽(tīng)器自身。在ObjC中要實(shí)現(xiàn)KVO則必須實(shí)現(xiàn)NSKeyValueObServing協(xié)議,不過(guò)幸運(yùn)的是NSObject已經(jīng)實(shí)現(xiàn)了該協(xié)議,因此幾乎所有的OC對(duì)象都可以使用KVO。
在ObjC中使用KVO操作常用的方法如下:
- 注冊(cè)指定Key路徑的監(jiān)聽(tīng)器: addObserver: forKeyPath: options: context:
- 刪除指定Key路徑的監(jiān)聽(tīng)器: removeObserver: forKeyPath、removeObserver: forKeyPath: context:
- 回調(diào)監(jiān)聽(tīng): observeValueForKeyPath: ofObject: change: context:
KVO的使用步驟也比較簡(jiǎn)單:
- 通過(guò)addObserver: forKeyPath: options: context:為被監(jiān)聽(tīng)對(duì)象(它通常是數(shù)據(jù)模型)注冊(cè)監(jiān)聽(tīng)器
- 重寫監(jiān)聽(tīng)器的observeValueForKeyPath: ofObject: change: context:方法