Mac開發(fā)之 Cocoa 綁定 入門

圖片來自網(wǎng)絡

從iOS開發(fā)轉(zhuǎn)為Mac OSX應用開發(fā)的過程中,cocoa 綁定算是比較大的一個差異,也是OSX上比較實用的技術(shù),cocoa 綁定讓開發(fā)者節(jié)省了大量的代碼,可以快速的完成一個應用開發(fā).本文將從三個方面為新入門Mac OSX開發(fā)的朋友來介紹cocoa綁定,希望大家能靈活的應用到自己的實際工程中.好了,一起動手來學習Cocoa 綁定吧~

1. 什么是綁定?

簡單的說,綁定就是建立視圖與數(shù)據(jù)對象之間的聯(lián)系,是一種通過數(shù)據(jù)對象來直接(這個是重點)驅(qū)動視圖顯示內(nèi)容的方式.使用cocoa 綁定意味著使用更少的代碼來實現(xiàn)同樣的功能(這個在后面的示例中會具體說明).

2.為什么使用綁定?

在日常開發(fā)中,我們?yōu)榱隧椖看a更易于維護,會將程序代碼劃分為獨立模塊或封裝類,其中最基礎(chǔ)的就是使用模型(M)-視圖(V)-控制器(C)進行協(xié)調(diào)工作.然而,在某些情況下,編寫相互分離的模型-視圖-控制器完全沒有必要,特別是當控制器僅僅是在模型與視圖之間傳遞信息時(比如一個UILabel需要顯示文本來自數(shù)據(jù)模型的內(nèi)容),為了解決這種情況,蘋果公司在OSX中引入了Cocoa綁定.

綁定只能在OSX上使用!!!

3.綁定簡單使用方式

3.1 視圖(View)綁定到模型(Model)

將視圖綁定到模型對象,就是告訴視圖需要顯示的內(nèi)容來自哪里(通常是數(shù)據(jù)模型對象的某個屬性),以及什么時候更新顯示內(nèi)容.當數(shù)據(jù)模型的某一屬性的值發(fā)生改變時,綁定系統(tǒng)就會通知每個綁定到它的視圖,告訴它們更新顯示.

例如,假設我們有一個Person對象,它有一個name屬性,如果將一個Label綁定到Person對象的name屬性上,那么它們兩個(Person和Label)將會被鏈接在一起,name屬性的值是什么,Label就會顯示什么.

綁定也可以反向工作.比如有一個可編輯的控件,當用戶修改內(nèi)容時,綁定系統(tǒng)會用新內(nèi)容更新數(shù)據(jù)模型的對應屬性值.

可以將視圖的許多不同屬性綁定到某一(或多個)模型的屬性上.能夠綁定的具體視圖屬性會因視圖不同而不同.

好了,基礎(chǔ)概念就先介紹到這里,我們先通過一個簡單的示例來具體了解綁定操作~

(1) 新建一個Cocoa應用程序,(示例開發(fā)語言使用Swift)

新建Cocoa應用

(2) 添加一個Person類,并添加一個 score屬性,初始值為0

添加Person類,并初始化score屬性為0

(3)選中Main.storyboard,添加界面組件

拖入一個Label,放在視圖的右側(cè),然后再拖入一個slider,把它放在Label的左側(cè),完成后,界面應用類似與下圖:

添加組件

(4)給ViewController添加一個屬性(Person類型)

給ViewController添加一個son屬性

(5)設置綁定,我們要讓Label顯示的內(nèi)容是son屬性的score值

在Main.storyboard中選中Label,然后在選中Bindings Inspector標簽,點擊Values,勾選Bingd to為ViewController,并設置Model key Path為son.score. 這樣就可以告訴綁定系統(tǒng),Label的顯示內(nèi)容來自于ViewController中的son屬性的score值,也就是我們說的Label與son進行了綁定(準確的說,就是Label的Values屬性與son的score屬性值進行了綁定,這樣當score數(shù)值發(fā)生變化的時候,綁定系統(tǒng)就會通知Label更新Values的內(nèi)容)

設置Label綁定

(6) 綁定Slider到控制器的son屬性的score值

設置Slider綁定

運行一下應用,并在窗口中拖動slider,看看label的變化,你會發(fā)現(xiàn),只有結(jié)束拖動slider的時候,Label的內(nèi)容才發(fā)生變化,如果需要實時顯示拖動slider的變化,我們僅需要設置一下slider控件的continuous屬性即可.

(7) 設置持續(xù)更新

設置slider的continuous

我們發(fā)現(xiàn)應用啟動時Label的顯示內(nèi)容為0,我們嘗試通過改變son的score值來看看結(jié)果,選擇ViewController,在ViewDidLoad中,添加代碼

(8)ViewController添加代碼

設置socre的初始值

運行一下,你會發(fā)現(xiàn)并沒有預想的結(jié)果,如果你使用Objective-C來構(gòu)建工程,就會發(fā)現(xiàn)運行的效果正確,這是因為Swift中默認是關(guān)閉了KVO的屬性監(jiān)聽,我們只需要開啟就可以了,在Person類中,給score屬性前面,添加一個關(guān)鍵字dynamic,然后再來試試運行吧

(9)設置Swift中的KVO

開啟KVO

(10) 通過改變score的值來影響Label和Slider

實際項目中,更常用的方式是score值變化,更新label和slider它們的顯示.下面我們通過點擊鼠標來修改一下son的socre值,在ViewController中,添加下面的代碼后看看結(jié)果吧.

添加代碼


當son的score值發(fā)生變化時,Label和Slider會同時更新它們的顯示.我們沒有在視圖和數(shù)據(jù)直接添加任何數(shù)據(jù)傳遞的代碼,就完成了它們之間的相互聯(lián)系,由此可見,cocoa綁定為我們節(jié)省了代碼量,簡化了開發(fā)步驟,同時也減少了Bug的可能.

3.2 綁定到控制器

在剛剛的例子中,我們將視圖直接綁定在模型對象的屬性上,跳過了控制器,這種情況對應簡單的使用沒有問題,但綁定還有更多的使用方式,也許你在簽名的例子中已經(jīng)注意到了,在設置Bind to的時候,系統(tǒng)默認的是Share User Default Controller,類似下圖:

系統(tǒng)默認綁定對象

NSUserDefaults 是一個數(shù)據(jù)存儲系統(tǒng),我們不能直接向它進行綁定操作,因為它的內(nèi)容不支持KVO(cocoa 綁定需要依賴KVO這一方式),因此蘋果提供了一個對象,可以讓我們在綁定中使用NSUserDefaults的信息,這個對象就是NSUserDefaultsController,因為它是很常見的一個控件,你甚至不需要創(chuàng)建就能開始使用,只需將控件綁定到默認系統(tǒng),就能讓它出現(xiàn)在Interface Bulider里,它提供了一些機制用于將視圖綁定到存儲在NSUserDefaults中的默認系統(tǒng),下面我們通過一個簡單的例子來看看如何使用NSUserDefaultsController吧,let's do it~

(1)新建一個cocoa 應用,并添加一個復選框,用于存儲用戶設置;添加一個slider,用于驗證設置是否生效,界面的視圖大概類似下面的樣子:

添加UI控件

(2)設置復選框的綁定,對復選框的Valus屬性進行綁定操作

綁定復選框的Value到默認系統(tǒng)

(3)設置slider的綁定(設置slider控件的enable屬性綁定),大體如下圖:

綁定slider的Enabled到默認系統(tǒng)


啟動應用,改變復選框的狀態(tài)時,注意滑塊的啟用或禁用狀態(tài),然后退出應用并重新啟動,注意觀察復選框,它已經(jīng)記住了用戶的上一次操作狀態(tài).

通過cocoa 綁定,我們沒有寫一行代碼就實現(xiàn)了記錄用戶設置的功能~

cocoa中還為我們提供了其他的控制器對象來處理應用程序中的數(shù)據(jù)訪問,比如NSArrayController,可以處理一組數(shù)據(jù)集合,(它常常與tableView或collectionView結(jié)合使用),NSObjectController可以充當單個對象的控制器,對象發(fā)生變化時,界面刷新.

cocoa還可以針對事件進行綁定,這使得我們的應用可以變得更加靈活,關(guān)于cocoa的更多綁定使用,大家可以查看蘋果的官方文檔,進一步了解,如果本文能起到拋磚引玉的作用,那實在已經(jīng)是筆者的榮譽了,感謝各位閱讀,并歡迎各位指正文中不足的地方~?

4. 參考資料

官方資料: Cocoa Bindings Programming Topics

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皿渗,一起剝皮案震驚了整個濱河市殿怜,隨后出現(xiàn)的幾起案子椅邓,更是在濱河造成了極大的恐慌抱完,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛球,死亡現(xiàn)場離奇詭異甚疟,居然都是意外死亡颤芬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門卓囚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厌衔,“玉大人,你說我怎么就攤上這事捍岳「皇伲” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵锣夹,是天一觀的道長页徐。 經(jīng)常有香客問我,道長银萍,這世上最難降的妖魔是什么变勇? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上搀绣,老公的妹妹穿的比我還像新娘飞袋。我一直安慰自己,他們只是感情好链患,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布巧鸭。 她就那樣靜靜地躺著,像睡著了一般麻捻。 火紅的嫁衣襯著肌膚如雪纲仍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天贸毕,我揣著相機與錄音郑叠,去河邊找鬼。 笑死明棍,一個胖子當著我的面吹牛乡革,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摊腋,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼沸版,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了歌豺?” 一聲冷哼從身側(cè)響起推穷,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎类咧,沒想到半個月后馒铃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡痕惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年区宇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片值戳。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡议谷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出堕虹,到底是詐尸還是另有隱情卧晓,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布赴捞,位于F島的核電站逼裆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏赦政。R本人自食惡果不足惜胜宇,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桐愉,春花似錦财破、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盏求,卻和暖如春抖锥,著一層夾襖步出監(jiān)牢的瞬間亿眠,已是汗流浹背碎罚。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纳像,地道東北人荆烈。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像竟趾,于是被迫代替她去往敵國和親憔购。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理岔帽,服務發(fā)現(xiàn)玫鸟,斷路器,智...
    卡卡羅2017閱讀 134,637評論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫犀勒、插件屎飘、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 天很藍, 云很淡贾费, 風很輕钦购, 你很美, 還好嗎褂萧, 我還好押桃, 有一種相見很輕。
    三毛不想再流浪閱讀 203評論 0 0
  • 目錄:1导犹、UIAlertControllerStyleAlert使用簡介2唱凯、UIAlertControllerSt...
    PZcoder閱讀 665評論 0 0
  • 想到最喜歡的書的時候,腦海里有一絲糾結(jié)谎痢,是《三體》磕昼,還是《平凡的世界》?然后就想到了《紅樓夢》舶得,沒錯掰烟,只有《紅樓夢...
    qwemb閱讀 1,738評論 3 10