给TableView设置一个Delegate


问题

决定要把一个委托设置给TableView。

方案

将遵循UITableViewDelegate协议的对象指定为TableView的delegate属性:

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

CGRect tableViewFrame = self.view.bounds;
self.myTableView = [[UITableView alloc] initWithFrame:tableViewFrame style:UITableViewStylePlain];
self.myTableView.delegate = self;

[self.view addSubview:self.myTableView];
}

@end

上面的代码将当前对象指定为TableView的委托。myTableView是属于调用视图控制器的UITableView中的一个属性。该语句嵌入在viewDidLoad方法中,因为调用对象是一个UIViewController的实例,并且这个方法是放置这段代码的正确位置,这样可以确保语句只被调用一次。

讨论

UITableView类定义了一个名为delegate的属性,TableView可以把这个属性分配给一个遵循UITableViewDelegate协议的对象,换句话说,这个委托必须保证回应些协议中定义的消息,这些消息通过TableView本身发送到委托对象。把TableView的委托看作是收听由TableView发送各种事件的对象,例如当一个单元格被选中,或者当一个TableView要指出它的单元格的高度。某种程序上,我们也可以使用Interface Builder来修正TableView及其单元格的视图外观。只要打开Interface Builder,选择一个你之前创建的TableView,然后选择Tools –> Size Inspector,在Size Inspector 板,可以通过TableView单元格的高度值就可以修改TableView的视觉外观。

为了使你选择的TableView的委托对象符合UITableViewDelegate协议,你需要通过下面的方法把协议增加到对象的接口声明中:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate>
@property (strong, nonatomic) UITableView *myTableView;
@end

对于那些UITableViewDelegate协议还有@required标记的消息要强制委托对象回应。可以选择性的回应其它消息,但是委托必须回应任何一条你想影响TableView的消息。

发送到一个TableView的委托对象的消息将拾一个参数,这个参数会告诉委托对象哪个TableView发出的消息,注意到这一点非常重要,因为在特定情况下你需要在一个对象(通常是视图)中放置超过一张TableView。因为这一点,极力推荐你做出的决定是基于事实上向你委托对象发送确切消息的TableView,比如:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
CGFloat result = 20.0f;

if ([tableView isEqual:self.myTableView]) {
result = 40.0f;
}

return result;
}

值得注意的是TableView中单元格的位置是由其indexPath表示的。一个索引路径是section和row索引的组合,section索引是从零开始的并指定每个单元格属于哪个分组或Section,而section中中的单元格索引又是从零开始的。