下面,我們將嘗試對先前的demo做如下變化:
?
(1)當用戶點擊一行時,顯示一個提醒消息
?
(2)當用戶選擇了一行時,顯示一個選中的標志
?
1.理解UITableViewDelegate
?
在我們創建Simple Table View 應用程序時,我們在SimpleTableController.h 中定義了2個委托(UITableViewDelegate 和 UITableViewDataSource):
?
#import<UIKit/UIKit.h>
?
@interface SimpleTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
?
@end
?
2個委托在Object-C 中稱為協議(protocol). 當創建了UITableView,你必須遵守這些協議中定義的要求。
?
在IOS編程中,遇到不同的委托是非常常見的。每一個委托負責特定的角色或任務,保持系統的簡潔。任何時候在一個對象需要完成特定任務時,它依賴于另外一個對象去負責處理。這個在系統設計領域通常稱為關注點分離(Separation of Concern).
?
當你分析UITableView 類時,它也應用了這一設計概念。這2個委托迎合了不同的目標。我們實現的UITableViewDataSource 委托定義了方法,用來顯示表數據;另一方面,UITableViewDelegate 委托則負責處理 UITableView界面和行選擇。
?
顯然,我們將使用UITableViewDelegate委托,來實現處理行選擇的方法。
?
2.處理表視圖行選擇(Table Row Selection)
?
在更改代碼之前,我們需要知道:
?
我們怎么知道UITableViewDelegate中的哪一個方法需要實現?
?
你需要參考Apple的iOS programming reference 文檔,有2種方法可以訪問該文檔。你可以選擇Apple網站的API文檔,或者直接在Xcode 中查詢。
?
如果讀完文檔,你將發現如下方法用來管理行選擇:
?
- tableView:willSelectRowAtIndexPath:
- tableView:didSelectRowAtIndexPath:
?
2個方法都用于行選擇。唯一的區別是:在行將要選擇的時候,調用willSelectRowAtIndexPath方法。通常,你可以使用這個方法來阻止選定特定的行。一般情況下,你使用didSelectRowAtIndexPath 方法,在用戶選擇一行時,調用這個方法去負責行選擇。在這個方法里面,添加代碼來指定具體業務行為,在行選擇的時候調用。
?
在本例子中,我們將添加一些動作來處理行選擇:
?
1)顯示警告消息
2)顯示一個勾選標志,表示改行已經選擇
?
3.coding start!
?
現在我們解釋足夠清楚了,接下來開始進入有趣的部分 - code, code, code !
?
在Xcode 中,打開 SimpleTableViewController.m? 文件, 在@end 指令之前添加如下方法:
?
?
- ( void )tableView:( UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath *)indexPath
{
? ? UIAlertView *messageAlert = [[ UIAlertView alloc ] initWithTitle : @" 行選擇 " message : @" 你已經選擇一行! " delegate: nil cancelButtonTitle : @" 確定 " otherButtonTitles: nil ];
? ? [messageAlert show ];
}
?
代碼非常容易理解。在選擇一行時,App 創建一個 UIAlertView 對象,并彈出一個警告消息。再次運行App,當你輕拍一行時,App顯示如下圖所示:
?
?
下面是改進之后的中文菜單顯示效果圖:
?
?
?
我們修改代碼入下
?
?
- ( void )tableView:( UITableView *)tableView didSelectRowAtIndexPath:( NSIndexPath *)indexPath
{
? ? NSString *message = [ tableData objectAtIndex :indexPath. row ];
? ? UIAlertView *messageAlert = [[ UIAlertView alloc ] initWithTitle : @" 行選擇 " message :message delegate : nil cancelButtonTitle : @" 確定 " otherButtonTitles : nil ];
? ? [messageAlert show ];
}
? ?? UITableViewCell *cell = [tableView cellForRowAtIndexPath :indexPath];
? ? cell. accessoryType = UITableViewCellAccessoryCheckmark ;
?
第一行通過使用indexPath獲得選中表的單元格,
第二行更新選中單元格的附件視圖為選中標志(Check Mark)
?
編譯運行App,在你輕拍一行后,將顯示一個選擇標志(Check Mark)
?
現在,當你選擇一行時,將以藍色突出顯示改行,如果你不喜歡,可以添加如下代碼取消這一效果:
?
[tableView deselectRowAtIndexPath :indexPath animated : YES ];
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
