【一步一步学IOS5 】 处理UITableView中的行选择

下面,我们将尝试对先前的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];

}



这样填出框就会显示菜谱的名字了



 

接着,我们将添加一些代码,显示所选择行的标志。在开始之前,让我们看看一个表格单元格默认内容:



 
一个单元格分为3部分:

图像(缩略图) - 左侧部分保留显示缩略图,就像我们之前在Simple Table 应用程序中实现的一样

内容 - 主要部分用来显示文本标签和相信内容

附件视图 (Accessory View) - 右侧部分保留为附件视图。 有3类默认的附件视图,包括 Disclosure 标示符、
Detail Disclosure 标示符和Check Mark(选中标示),下图显示了这些标示符的效果:



 
在行选择之后,为了显示选中标志,仅需要在[messageAlert show] 代码之后,添加如下2行代码:

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

 

第一行通过使用indexPath获得选中表的单元格,

第二行更新选中单元格的附件视图为选中标志(Check Mark)

 

编译运行App,在你轻拍一行后,将显示一个选择标志(Check Mark)

 


现在,当你选择一行时,将以蓝色突出显示改行,如果你不喜欢,可以添加如下代码取消这一效果:

 

[tableView deselectRowAtIndexPath:indexPath animated:YES];




 
 


 

猜你喜欢

转载自alan-hjkl.iteye.com/blog/1678049