鍍金池/ 教程/ iOS/ 定義交互
查找信息
使用設計模式
設計用戶界面
應用程序開發(fā)過程
iOS 技術(shù)
接下來做什么
串聯(lián)圖
處理 Foundation
編寫自定類
整合數(shù)據(jù)
基礎
設置
添加數(shù)據(jù)
定義交互

定義交互

對用戶界面進行布局后,接下來就需要讓用戶與界面進行交互。這時就要使用控制器了。控制器能響應用戶操作并使用內(nèi)容填充視圖,從而支持您的視圖。控制器對象是一個管道,通過它,視圖能了解數(shù)據(jù)模型的修改,反之亦然。應用程序的控制器會通知視圖有關(guān)模型數(shù)據(jù)中的修改,之后控制器會將用戶發(fā)起的修改(例如,在文本欄中輸入的文本)傳達到模型對象。不論模型對象是響應用戶操作,還是定義瀏覽,控制器都會實現(xiàn)應用程序的行為。

http://wiki.jikexueyuan.com/project/ios-developer-library/images/ModelViewController_c_2x.png" alt="" />

視圖控制器

構(gòu)建了基本的視圖層次后,下一步就需要控制可視元素并響應用戶輸入。在 iOS 應用程序中,您可以使用視圖控制器 (UIViewController) 來管理內(nèi)容視圖及其分視圖層次。

http://wiki.jikexueyuan.com/project/ios-developer-library/images/view_layer_objects_2x.png" alt="" />

視圖控制器并不是視圖層次的一部分,也不是界面中的元素。相反,它管理著層次中的視圖對象,并為它們提供行為。在串聯(lián)圖中構(gòu)建的每個內(nèi)容視圖層次,都需要一個對應的視圖控制器來管理界面元素,并執(zhí)行任務來響應用戶的交互操作。通常,這意味著您需要為每個內(nèi)容視圖層次編寫一個自定 UIViewController 子類。如果應用程序有多個內(nèi)容視圖,那么就需要為每個內(nèi)容視圖使用不同的自定視圖控制器類。

視圖控制器扮演著多種角色。它們負責協(xié)調(diào)應用程序的數(shù)據(jù)模型與顯示該數(shù)據(jù)的視圖之間的信息傳輸,管理應用程序的內(nèi)容視圖的生命周期,并處理設備旋轉(zhuǎn)時方向的更改。但其最主要的作用可能是響應用戶輸入。

您還可以使用視圖控制器來轉(zhuǎn)換各種類型的內(nèi)容。由于 iOS 應用程序顯示內(nèi)容的空間很有限,因此視圖控制器提供了所需要的基礎結(jié)構(gòu),可讓您移除一個視圖控制器的視圖,替換為另一個視圖控制器中的視圖。

通過讓視圖控制器文件與串聯(lián)圖中的視圖進行通信,可以定義應用程序中的交互方式。方法是通過 Action 與 Outlet 來定義串聯(lián)圖與源代碼文件之間的連接。

操作 (Action)

操作 是一段代碼,它與應用程序中可能會發(fā)生的某類事件相鏈接。該事件發(fā)生后,代碼就會執(zhí)行。您可以定義操作來完成任何事情:從操控數(shù)據(jù)到更新用戶界面。操作可驅(qū)動應用程序的流程來響應用戶事件或者系統(tǒng)事件。

可采用如下方法來定義:使用 IBAction 返回類型和 sender 參數(shù)來創(chuàng)建并實現(xiàn)方法。

- (IBAction)restoreDefaults:(id)sender;

sender 參數(shù)指向負責觸發(fā)操作的對象。IBAction 返回類型是個特殊的關(guān)鍵詞。它與 void 關(guān)鍵詞類似,但它表示該方法是一種操作,您可以在 Interface Builder 的串聯(lián)圖中連接到這種操作(這就是這個關(guān)鍵詞有 IB 前綴的原因)。在串聯(lián)圖中,您會了解如何將 IBAction 操作鏈接到串聯(lián)圖中元素的更多知識。

Outlet

Outlet 可讓您從源代碼文件引用界面中的對象(添加到串聯(lián)圖的對象)。您可以按住 Control 鍵,并將串聯(lián)圖中的特定對象拖移至視圖控制器文件來創(chuàng)建 Outlet。這就為視圖控制器文件中的對象創(chuàng)建了屬性,通過該屬性,您可以在運行時通過代碼來訪問并操控該對象。例如,在第二個教程中,您將為 ToDoList 應用程序中的文本欄創(chuàng)建 Outlet,這樣就可以用代碼的形式訪問文本欄的內(nèi)容。

Outlet 被定義為 IBOutlet 屬性。

@property (weak, nonatomic) IBOutlet UITextField *textField;

IBOutlet 關(guān)鍵詞告訴 Xcode,您可以從 Interface Builder 連接到該屬性。在“教程:串聯(lián)圖”中,您會了解有關(guān)如何從串聯(lián)圖將 Outlet 連接到源代碼的更多知識。

控制 (Control)

控制是用戶界面對象(例如按鈕、滑塊或者開關(guān)),用戶可以操控它們來與內(nèi)容進行交互、提供輸入、在應用程序內(nèi)導航,以及執(zhí)行所定義的其他操作。代碼可通過控制來接收用戶界面的消息。

用戶與控制進行交互,會創(chuàng)建控制事件??刂剖录硎居脩艨稍诳刂粕鲜褂玫母鞣N手勢,例如將手指抬離控制、手指拖移到控制上,以及在文本欄中按下。

常見的事件類型有三種:

  • 觸碰和拖移事件。用戶通過觸碰或者拖移與控制交互時,發(fā)生的就是觸碰和拖移事件。觸碰事件分幾個階段。例如,當用戶初次用手指觸碰按鈕,就會觸發(fā) Touch Down Inside 事件;如果用戶手指拖離按鈕,則會觸發(fā)相應的拖移事件。當用戶的手指抬離按鈕但仍停留按鈕邊緣的范圍內(nèi),就會發(fā)送 Touch Up Inside。如果用戶在抬起手指前,手指已經(jīng)拖離了按鈕(實際上是取消了觸碰),就會觸發(fā) Touch Up Outside 事件。
  • 編輯事件。用戶編輯文本欄,發(fā)生的是編輯事件。
  • 值更改事件。用戶對控制進行操控,從而導致控制產(chǎn)生一系列不同的值,發(fā)生的是值更改事件。

定義交互時,您應該了解與應用程序中每個控制相關(guān)聯(lián)的操作,然后明確地向用戶展示應用程序中控制的作用。

導航控制器

如果應用程序有多個內(nèi)容視圖層次,就需要能夠在它們之間進行切換。為此,可以使用專門的視圖控制器:導航控制器 (UINavigationController)。導航控制器管理在一系列視圖控制器中向后和向前切換的操作,例如用戶在 iOS 版“郵件”應用程序的電子郵件帳戶、收件箱郵件和單封電子郵件之間導航。

我們將由特定導航控制器所管理的一組視圖控制器稱為其導航棧。導航棧是一組后進先出的自定視圖控制器對象。添加到堆棧的第一個項目將變成根視圖控制器,永不會從堆棧中彈出。而其他視圖控制器可被壓入或彈出導航棧。

雖然導航控制器的最主要作用是管理內(nèi)容視圖控制器的顯示方式,但它還負責顯示自己的自定視圖。具體來說,它會顯示導航欄(位于屏幕頂部的視圖,提供有關(guān)用戶在導航層次中位置的上下文)。導航欄包含一個返回按鈕和其他可以自定的按鈕。添加到導航棧的每個視圖控制器都會顯示這個導航欄。您需要配置導航欄。

一般而言,您不必執(zhí)行任何操作來將視圖控制器彈出導航棧;導航控制器提供的返回按鈕會實現(xiàn)該操作。但您需要手動將視圖控制器壓入堆棧中??墒褂么?lián)圖來操作。

使用串聯(lián)圖來定義導航

到目前為止,您已經(jīng)學習了使用串聯(lián)圖來創(chuàng)建包含單個屏幕內(nèi)容的應用程序。接下來,將要了解如何使用它們來定義應用程序中多個場景之間的流程。

在第一個教程中,所使用的串聯(lián)圖只有一個場景。而在大多數(shù)應用程序中,串聯(lián)圖是由一系列的場景組成,每個場景表示一個視圖控制器及其視圖層次。場景則由過渡連接。過渡表示兩個視圖控制器之間的切換:源視圖控制器和目的視圖控制器。

http://wiki.jikexueyuan.com/project/ios-developer-library/images/segue_2x.png" alt="" />

您可以創(chuàng)建以下幾種類型的過渡:

  • Push。Push 過渡將目的視圖控制器添加到導航棧。只有當源視圖控制器與導航控制器連接時,才可以使用 Push 過渡。
  • Modal。簡單而言,Modal 過渡就是一個視圖控制器以模態(tài)方式顯示另一個控制器,需要用戶在顯示的控制器上執(zhí)行某種操作,然后返回到應用程序的主流程。Modal 視圖控制器不會添加到導航棧;相反,它通常被認為是所顯示的視圖控制器的子視圖控制器。顯示的視圖控制器的作用是關(guān)閉它所創(chuàng)建和顯示的 Modal 視圖控制器。
  • Custom??梢酝ㄟ^將 UIStoryboardSegue 子類化來定義自定過渡。
  • Unwind。Unwind 過渡通過向后移動一個或多個過渡,讓用戶返回到視圖控制器的當前實例。使用 Unwind 過渡可以實現(xiàn)反向?qū)Ш健?/li>

除了過渡之外,還可以通過關(guān)系來連接場景。例如,導航控制器與其根視圖控制器之間就存在關(guān)系。就此而言,這種關(guān)系表示導航控制器包含根視圖控制器。

使用串聯(lián)圖規(guī)劃應用程序的用戶界面時,要確定將其中一個視圖控制器標記為初始視圖控制器,這一點尤為重要。運行時,該視圖控制器的內(nèi)容視圖會在應用程序首次啟動時顯示,且在需要時,您可以從該視圖控制器切換到其他視圖控制器的內(nèi)容視圖。

現(xiàn)在您已經(jīng)了解了在串聯(lián)圖中處理視圖和視圖控制器的基礎知識。在下一個教程中,我們就要將這些知識運用到 ToDoList 應用程序的開發(fā)中。

上一篇:基礎下一篇:接下來做什么