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