给TableView设置一个Delegate
问题
决定要把一个委托设置给TableView。
方案
将遵循UITableViewDelegate协议的对象指定为TableView的delegate属性:
(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协议,你需要通过下面的方法把协议增加到对象的接口声明中:
@interface ViewController : UIViewController <UITableViewDelegate> @property (strong, nonatomic) UITableView *myTableView; @end
对于那些UITableViewDelegate协议还有@required标记的消息要强制委托对象回应。可以选择性的回应其它消息,但是委托必须回应任何一条你想影响TableView的消息。
发送到一个TableView的委托对象的消息将拾一个参数,这个参数会告诉委托对象哪个TableView发出的消息,注意到这一点非常重要,因为在特定情况下你需要在一个对象(通常是视图)中放置超过一张TableView。因为这一点,极力推荐你做出的决定是基于事实上向你委托对象发送确切消息的TableView,比如:
if ([tableView isEqual:self.myTableView]) {
result = 40.0f;
}
return result;
}
值得注意的是TableView中单元格的位置是由其indexPath表示的。一个索引路径是section和row索引的组合,section索引是从零开始的并指定每个单元格属于哪个分组或Section,而section中中的单元格索引又是从零开始的。