表格试图用于显示列表数据,NstableView有一个helper的对象叫做datasouce 表格试图希望为数据源定义一些方法,一般来讲,“数据源必须遵循NStableDatasouce的非正式协议。就是说数据源必须实现以下的两个方法。number of rows
datasouce 回应将要显示的数据行。
在实现委托时常见的错误
(1)拼错方法的名字:该方法不会被调用,开发者也不会从编译器获得任何错误和警告,避免这个问题的最好方法是从文档或者头文件中复制和粘贴方法的声明。
(2)忘记设施delegate outlet. 如果犯了这种错误,不会从编译器获得任何错误或者警告信息。
委托是怎样工作的。
委托对象没有必要实现所有的方法,但是,假设对像实现了一个委托方法,那它就应该被调用。在很多的语言中,这是不可能。拿在oc中是怎么实现的。
NSObject有如下的方法
-(bool)respondsToSelector:(sel)aSelector
因为每个对象都继承自NSObject(直接或者间接)那么,每个对象都应该有这个方法,假如对象有一个叫aSelector的方法,那么它返回yes,注意aSelector是SEl类型,而不是NSstring类型
设想自己是一个必须编写nstableview的工程师,正在编写一段代码。实现用户从表格试图的一行更改为选择宁一行,那么,你可能会提示自己“我应该检查一下委托对象”为了完成这一项的功能。。代码如下
//修改row“rowINdex”
bool ok =yes;
if([delegate respondtoselector:@selector(tableview:should selectRow)]){
ok=[delegate tableview:self should selectRow:rowindex];
}
if(ok){
....actually change the selection;
}
注意,,只有在委托对象实现方法时才发送的消息。假如委托对象并没有发送消息。就会产生默认的动作(事实上,respondsToSelector:)的结果一般由对象使用delegate outlet缓存,这使得代码执行相对较快
方法写好后,注意在代码中通知该方法的存在。
假如要看看检查的委托方法存在与否过程。可在委托对象中重载respondToSelector
-(bool)respondsToSelector:(sel)aselector{
NSString *methodName =NSStringFrom(aselector);
NSLog(@"respondsToSelector:%@",methodName);
return[super respondsToSelector:aSelector];
}