天天看點

《iOS 8開發指南》——第6章,第6.3節在Xcode中實作MVC

本節書摘來自異步社群《ios 8開發指南》一書中的第6章,第6.3節在xcode中實作mvc,作者 管蕾,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

6.3 在xcode中實作mvc

ios 8開發指南

在本書前面的内容中,已經講解了xcode及其內建的interface builder編輯器的知識。并且在本書上一章的内容中,曾經将故事闆場景中的對象連接配接到了應用程式中的代碼。在本節的内容中,将詳細講解将視圖綁定到控制器的知識。

6.3.1 視圖

在xcode中,雖然可以使用程式設計的方式建立視圖,但是在大多數情況下是使用interface builder以可視化的方式設計它們。在視圖中可以包含衆多界面元素,在加載運作階段程式時,視圖可以建立基本的互動對象,例如,當輕按文本框時會打開鍵盤。要讓想視圖中的對象能夠與應用程式實作邏輯互動,必須定義相應的連接配接。連接配接的東西有兩種:輸出口和操作。輸出口定義了代碼和視圖之間的一條路徑,可以用于讀寫特定類型的資訊,例如對應于開關的輸出口讓我們能夠通路描述開關是開還是關的資訊;而操作定義了應用程式中的一個方法,可以通過視圖中的事件觸發,例如輕按按鈕或在螢幕上輕掃。

如果将輸出口和操作連接配接到代碼呢?必須在實作視圖邏輯的代碼(即控制器)中定義輸出口和操作。

6.3.2 視圖控制器

控制器在xcode中被稱為視圖控制器,功能是負責處理與視圖的互動工作,并為輸出口和操作之間建立一個人為連接配接。為此需要在項目代碼中使用兩個特殊的編譯指令:ibaction和iboutlet。ibaction和iboutlet是interface builder能夠識别的标記,它們在objective-c中沒有其他用途。我們在視圖控制器的接口檔案中添加這些編譯指令。我們不但可以手工添加,而且也可以用interface builder的一項特殊功能自動生成它們。

視圖控制器可包含應用程式邏輯,但這并不意味着所有代碼都應包含在視圖控制器中。雖然在本書中,大部分代碼都放在視圖控制器中,但當您建立應用程式時,可在合适的時候定義額外的類,以抽象應用程式邏輯。

1.使用iboutlet

iboutlet對于編譯器來說是一個标記,編譯器會忽略這個關鍵字。interface builder則會根據iboutlet來尋找可以在builder裡操作的成員變量。在此需要注意的是,任何一個被聲明為iboutlet并且在interface builder裡被連接配接到一個ui元件的成員變量,會被額外記憶一次,例如:

這個label在interface builder裡被連接配接到一個uilabel。此時,這個label的retaincount為2。是以,隻要使用了iboutlet變量,一定需要在dealloc或者viewdidunload中釋放這個變量。

iboutlet的功能是讓代碼能夠與視圖中的對象互動。假設在視圖中添加了一個文本标簽(uilabel),而我們想在視圖控制器中建立一個執行個體“變量/屬性”mylabel。此時可以顯式地聲明它們,也可使用編譯指令@property隐式地聲明執行個體變量,并添加相應的屬性:

這個應用程式提供了一個存儲文本标簽引用的地方,還提供了一個用于通路它的屬性,但還需将其與界面中的标簽關聯起來。為此,可在屬性聲明中包含關鍵字iboutlet:

添加該關鍵字後,就可以在interface builder中以可視化方式将視圖中的标簽對象連接配接到變量/屬性mylabel,然後可以在代碼中使用該屬性與該标簽對象互動:修改其文本、調用其方法等。這樣,這行代碼便聲明了執行個體變量、屬性和輸出口。

2.使用編譯指令property和synthesize簡化通路

@property和@synthesize是objective-c語言中的兩個編譯指令。執行個體變量存儲的值或對象引用可在類的任何地方使用。如果需要建立并修改一個在所有類方法之間共享的字元串,就應聲明一個執行個體變量來存儲它。良好的程式設計慣例是,不直接操作執行個體變量。是以要使用執行個體變量,需要有相應的屬性。

編譯指令@property定義了一個與執行個體變量對應的屬性,該屬性通常與執行個體變量同名。雖然可以先聲明一個執行個體變量,再定義對應的屬性,但是也可以使用@property隐式地聲明一個與屬性對應的執行個體變量。例如要聲明一個名為mystring的執行個體變量(類型為nsstring)和相應的屬性,可以編寫如下所示的代碼實作:

apple xcode工具通常建議隐式地聲明執行個體變量,是以建議大家也這樣做。

這同時建立了執行個體變量和屬性,但是要想使用這個屬性則必須先合成它。編譯指令@synthesize建立擷取函數和設定函數,讓我們很容易通路和設定底層執行個體變量的值。對于接口檔案(.h)中的每個編譯指令@property,實作檔案( .m)中都必須有對應的編譯指令@synthesize:

@synthesize mystring;

3.使用ibaction

ibaction用于指出在特定的事件發生時應調用代碼中相應的方法。假如按下了按鈕或更新了文本框,則可能想應用程式采取措施并做出合适的反應。編寫實作事件驅動邏輯的方法時,可在頭檔案中使用ibaction聲明它,這将向interface builder編輯器暴露該方法。在接口檔案中聲明方法(實際實作前)被稱為建立方法的原型。

例如,方法docalculation的原型可能類似于下面的情形:

-(ibaction)docalculation: (id) sender;

注意到該原型包含一個sender參數,其類型為id。這是一種通用類型,當不知道(或不需要知道)要使用的對象的類型時可以使用它。通過使用類型id,可以編寫不與特定類相關聯的代碼,使其适用于不同的情形。建立将用作操作的方法(如docalculation)時,可以通過參數sender确定調用了操作的對象并與之互動。如果要設計一個處理多種事件(如多個按鈕中的任何一個按鈕被按下)的方法,這将很友善。

繼續閱讀