從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)
(2) 添加一個Person類,并添加一個 score屬性,初始值為0
(3)選中Main.storyboard,添加界面組件
拖入一個Label,放在視圖的右側(cè),然后再拖入一個slider,把它放在Label的左側(cè),完成后,界面應用類似與下圖:
(4)給ViewController添加一個屬性(Person類型)
(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)容)
(6) 綁定Slider到控制器的son屬性的score值
運行一下應用,并在窗口中拖動slider,看看label的變化,你會發(fā)現(xiàn),只有結(jié)束拖動slider的時候,Label的內(nèi)容才發(fā)生變化,如果需要實時顯示拖動slider的變化,我們僅需要設置一下slider控件的continuous屬性即可.
(7) 設置持續(xù)更新
我們發(fā)現(xiàn)應用啟動時Label的顯示內(nèi)容為0,我們嘗試通過改變son的score值來看看結(jié)果,選擇ViewController,在ViewDidLoad中,添加代碼
(8)ViewController添加代碼
運行一下,你會發(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
(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,類似下圖:
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,用于驗證設置是否生效,界面的視圖大概類似下面的樣子:
(2)設置復選框的綁定,對復選框的Valus屬性進行綁定操作
(3)設置slider的綁定(設置slider控件的enable屬性綁定),大體如下圖:
啟動應用,改變復選框的狀態(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)是筆者的榮譽了,感謝各位閱讀,并歡迎各位指正文中不足的地方~?