如果你跟着學習iOS編程的教程,我相信你應該創建一個有自定義的表格單元格簡單的表視圖的應用程序。到目前為止,我們專注於表視圖中的數據顯示。但是,在有人在表上點擊時我們就不知道干什么了。這是我們將在這篇文章告訴你的,關於如何處理行選擇。
首先,讓我們回顧一下我們的應用程序看看我們將添加的東西。
有一些變化把,我們在本教程中實現的內容有:
· 當用戶點擊一行, 顯示一條警告消息,
· 當用戶選擇某一行,顯示一個復選標記
了解UITableViewDelegate
當您第一次建立了簡單的表視圖應用程序,你在SimpleTableController.h聲明了兩個的委托(UITableViewDelegate,UITableViewDataSource),
1
2 3 4 5 |
#import <UIKit/UIKit.h>
@interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> @end |
正如在前面的教程解釋的哪有,這兩個委托是Objective-C的協議。你必須遵守這些協議中所規定的某些要求來建立一個UITableView。
在iOS編程遇到各種委托是很常見的。每個委托負責一個特定的角色或任務,以保持系統的簡單和干凈。當一個對象需要執行特定的任務,它依賴於另一個對象來處理。這通常被稱為系統設計關注點分離。
當你在看到UITableView類時,它也適用於這樣的設計理念。兩位委托為不同的目的提供需求。我們剛剛實現的UITableViewDataSource委托,定義了用於顯示表中的數據的方法。而UITableViewDelegate定義了UITableView的外觀,以及處理的行選擇。
很明顯,我們將利用的UITableViewDelegate並實現所需的方法來處理行選擇。
處理表行選擇
在我們更改代碼之前,你可能會問:
我們怎么知道在UITableViewDelegate的哪些方法需要實現嗎?
您可以隨時參閱蘋果公司的iOS編程參考。有兩種方法可以訪問該文檔。您可以訪問蘋果公司的網站上API文檔。或者干脆看看它在Xcode里面的提示。例如,你想看UITableViewDelegateAPI文檔,只需將光標移到類名上,然后按“control-command-?”。你會看到以下的彈出窗口:

快捷鍵來執行API文檔
點擊API文檔中UITableViewDelegate協議參考:

UITableViewDelegate協議參考
如果你閱讀整個文檔,你會發現這些方法,可以用來管理行選擇:
– tableView:willSelectRowAtIndexPath:
– tableView:didSelectRowAtIndexPath:
兩種方法都可用於行選擇。當一行即將被選中時觸發“willSelectRowAtIndexPath”。一般利用此方法,以防止一個特定行被選擇生。通常情況下,您可以使用“didSelectRowAtIndexPath”的方法,這是在用戶選擇某一行后調用來處理行選擇,並執行用戶添加的代碼。在本教程中,我們將添加一些行為來處理行選擇:
· 顯示警報消息
· 顯示一個復選標記,以指示行被選中
讓我們開始代碼編寫把
好了,解釋足夠了,讓我們進入到了有趣的部分 – 敲代碼,代碼,碼!
在Xcode中,打開“SimpleTableViewController.m”,在 “@end” 前添加下面的方法。
1
2 3 4 5 6 7 8 9 |
-
(
void
)tableView
:
(UITableView
*
)tableView didSelectRowAtIndexPath
:
(
NSIndexPath
*
)indexPath
{ UIAlertView *messageAlert = [ [UIAlertView alloc ] initWithTitle : @ "Row Selected" message : @ "You've selected a row" delegate : nil cancelButtonTitle : @ "OK" otherButtonTitles : nil ]; // Display Alert Message [messageAlert show ]; } |
這些代碼是很容易理解的。當行被選中時,應用程序創建一個UIAlertView,並顯示一條警告消息。嘗試運行應用程序,當你點擊一行時應用程序會是這樣:

當行被選中,顯示警報消息
你的練習
現在,當我們點擊一行時,選擇的是一個通用消息。如果顯示下面那樣會更好,對吧:
想想你應該怎么改變代碼 (hint: the indexPath parameter contains the row number of the selected row) and display the message like the screenshot shown above. It’s not difficult to do so if you’ve followed the previous tutorial.
Easy, right? With the use of delegate, it’s very straightforward to detect row selection. Next, we’ll add a few lines of code to display a tick for the selected item. Before that, let me take a look at the default content of a table cell:

UITableViewCell的默認構造
表單元格可以分為三個部分:
· 縮略圖- 左邊部分是保留給顯示縮略圖,就像我們在簡單的表應用教程做了的那樣,
· 內容 – 中間主要部分用於顯示文本標簽和詳細的文字
· 附件視圖 - 右邊部分是保留的輔助視圖。有三種默認附件類型,包括披disclosure indicator,detail disclosure button(詳細披露按鈕)和check mark(復選標記)。下面的圖顯示了這些類型的樣子。

UITableViewCell 附件視圖
要顯示一個復選標記表示是否選擇了該行,你只需要在““[messageAlert show]”后添加兩行代碼:
1
2 |
UITableViewCell
*cell
=
[tableView cellForRowAtIndexPath
:indexPath
];
cell.accessoryType = UITableViewCellAccessoryCheckmark; |
第一行代碼通過indexPath來檢索選定的表單元格。第二行代碼說明選中的單元格有復選標記。
編譯並運行應用程序。當你點擊一行數據后,它顯示一個復選標記。
現在,當你選擇一行,該行將會高亮藍色顯示。如果你不喜歡它,嘗試添加以下代碼來取消選擇該行的效果。
1
|
[tableView deselectRowAtIndexPath
:indexPath animated
:
YES
];
|
即將推出的下一個教程是什么?
我希望你們已經學會了很多東西!到現在為止,你對如何創建表視圖應該有一個更好的了解,自定義表格單元格和處理表行選擇。請確保您了解的信息教程中,UITableView是一種常見的UI元素在iOS。如果您有任何疑問,請前往我們的論壇與我們分享。
對於iOS編程,學習的東西還有很多。在未來的教程中,我們將看到如何用文件或者數據庫取代食譜數組,以及用故事板來建立一個更復雜的應用程序。