iOS開發(fā)之KVC,KVO

第一次寫簡書

    在簡書上學到很多iOS知識,今天第一次分享文章利赋,希望以后自己有時間多總結云芦,發(fā)布文章整理贪惹,利人利己察蹲。如有不對的地方济锄,請大家指正聊浅!

KVC

    KVC(key-value-coding),鍵值編碼餐抢。說白了就是通過類屬性的key獲取其屬性的value现使,而不用通過Setter,Getter,這個在開發(fā)中很實用旷痕。

舉個例子:
Student 類有2個屬性

// 名字
@property (nonatomic, copy)NSString *name;
// 分數(shù)
@property (nonatomic, assign)float score;

設置Student值碳锈,2種方法可達同樣效果

    Student *student1 = [[Student alloc] init];
    student1.name = @"zhangsan";
    student1.score = 100;
    
    Student *student2 = [[Student alloc] init];
    [student2 setValue:@"lisi" forKeyPath:@"name"];
    [student2 setValue:@99 forKeyPath:@"score"];

開發(fā)中常用的案例:
1,替換UITabBarController的tabBar

    // 更換tabBar
    [self setValue:[[MyTabBar alloc] init] forKeyPath:@"tabBar"];
B3657847A5C6DD1DE909A375F7597F73.jpg

2欺抗,設置UITextField占位符的顏色售碳,F(xiàn)ont

    [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
    [textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

KVC,用處很大,功能很強大绞呈,有興趣的可以繼續(xù)深入研究贸人。

KVO

    KVO(key-value-observing),建立在KVC,利用類屬性key監(jiān)聽其值的變化。說白了佃声,就是屬性值一旦有變化就通知觀察者艺智。

使用步驟:
1,注冊監(jiān)聽
2圾亏,設置監(jiān)聽事件(如zhangsan的score成績一旦變化就告訴他媽)
3十拣,注銷監(jiān)聽
以上面的student1對象實例為例:

// 監(jiān)聽
[student1 addObserver:self forKeyPath:@"score" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

// 監(jiān)聽這個方法回調
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    // 在這個方法里面監(jiān)聽屬性變化,如zhangsan的score成績一旦變化就告訴他媽咪 O(∩_∩)O~
    
}

- (void)dealloc{
    // 注銷
    [self.student1 removeObserver:self forKeyPath:@"score"];
}

常用開發(fā)案例
1志鹃,監(jiān)聽UITableVIew的contentOffset,根據(jù)表格偏移量輕松改變navigationBar的位置夭问,顏色等設置

  [tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];

2,一般APP都有編輯個人信息頁面曹铃,利用KVO監(jiān)聽用戶編輯的信息即刻更新UI并且提交新數(shù)據(jù)到服務器甲喝,無需再為每個修改項寫處理函數(shù)。


8B01CF602F8C0B5F5CF4E3A67A20CCC8.jpg

補充KVC可以放R大招
你還在用for循環(huán)計算集合數(shù)據(jù)的總數(shù)铛只,平均值埠胖?那你就out了,Q,W,E,R直接搞掂淳玩。

    Student *student1 = [[Student alloc] init];
    student1.name = @"zhangsan";
    student1.score = 100;
    
    Student *student2 = [[Student alloc] init];
    [student2 setValue:@"lisi" forKeyPath:@"_name"];
    [student2 setValue:@99 forKeyPath:@"score"];
    
    Student *student3 = [[Student alloc] init];
    [student3 setValue:@"wangwu" forKeyPath:@"_name"];
    [student3 setValue:@71 forKeyPath:@"score"];
    
    
    Teacher *teacher = [[Teacher alloc] init];
    teacher.name = @"Miss Lu";
    teacher.studentArray = [NSMutableArray array];
    [teacher.studentArray addObject:student1];
    [teacher.studentArray addObject:student2];
    [teacher.studentArray addObject:student3];
    
    // 平均分數(shù)
    NSNumber *avgSccore = [teacher valueForKeyPath:@"studentArray.@avg.score"];
    NSLog(@"%@", avgSccore);
    
    // 總分
    NSNumber *totalScore = [teacher valueForKeyPath:@"studentArray.@sum.score"];
    NSLog(@"%@", totalScore);
    
    // 最低分直撤,最高分
    NSNumber *min = [teacher valueForKeyPath:@"studentArray.@min.score"];
    NSLog(@"%@", min);
    NSNumber *max = [teacher valueForKeyPath:@"studentArray.@max.score"];
    NSLog(@"%@", max);
    
    // 求同學數(shù)量
    NSArray *studentCount = [teacher valueForKeyPath:@"studentArray.@count"];
    NSLog(@"%@", studentCount);
    
    // 獲取所有同學的分數(shù)
    NSArray *sccoreArray = [teacher valueForKeyPath:@"studentArray.score"];
    NSLog(@"%@", sccoreArray);

如有不對的地方,請大家指正蜕着!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末谋竖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子承匣,更是在濱河造成了極大的恐慌蓖乘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韧骗,死亡現(xiàn)場離奇詭異嘉抒,居然都是意外死亡,警方通過查閱死者的電腦和手機袍暴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門些侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隶症,“玉大人,你說我怎么就攤上這事岗宣÷旎幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵耗式,是天一觀的道長胁住。 經(jīng)常有香客問我,道長刊咳,這世上最難降的妖魔是什么措嵌? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮芦缰,結果婚禮上企巢,老公的妹妹穿的比我還像新娘。我一直安慰自己让蕾,他們只是感情好浪规,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著探孝,像睡著了一般笋婿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿颅,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天缸濒,我揣著相機與錄音,去河邊找鬼粱腻。 笑死庇配,一個胖子當著我的面吹牛,可吹牛的內容都是我干的绍些。 我是一名探鬼主播捞慌,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柬批!你這毒婦竟也來了啸澡?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤氮帐,失蹤者是張志新(化名)和其女友劉穎嗅虏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體上沐,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡皮服,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冰更。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡产徊,死狀恐怖昂勒,靈堂內的尸體忽然破棺而出蜀细,到底是詐尸還是另有隱情,我是刑警寧澤戈盈,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布奠衔,位于F島的核電站,受9級特大地震影響塘娶,放射性物質發(fā)生泄漏归斤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一刁岸、第九天 我趴在偏房一處隱蔽的房頂上張望脏里。 院中可真熱鬧,春花似錦虹曙、人聲如沸迫横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矾踱。三九已至,卻和暖如春疏哗,著一層夾襖步出監(jiān)牢的瞬間呛讲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工返奉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贝搁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓芽偏,卻偏偏與公主長得像徘公,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哮针,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容