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

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