我正在Cocoa Touch API上实现一个可选的委托方法。我想做的是,如果我没有实现委托,首先调用将调用的方法...然后更改结果...然后返回我的修改版本。
以下是一个例子:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; {
/* this line: */ UIView * headerView = [someObject tableView:tableView viewForHeaderInSection:section];
[headerView setBackgroundColor:[UIColor redColor]];
return headerView;
}
标记的行不起作用。我可以把someObject = tableView.delegate,但这只是给我无限递归。有没有一些技巧可以让tableView做任何事情,如果没有实现可选方法呢?我不是很有希望,但如果可能的话会很酷。
答案 0 :(得分:6)
如果没有实现委托,则不会调用任何方法。代表不像子类;它们不是语言功能。 UITableView(在这种情况下)做了一些工作,看看它的-delegate属性是否为非零(这只是一个恰好被称为“委托”的随机ivar),如果是这样,它看到委托实现了委托方法,如果它调用它,那么做更多的工作。
UITableView没有暴露默认的部分标题视图(我相信它是一个名为UISectionHeaderCell的私有子类),所以Apple没有对它的实现方式做出任何承诺。或者给我们一个很好的方法来获取它有几种方法可以进入相关视图,但Apple尚未向我们提供任何我所知道的支持方式。
但是关于代表的一般问题,你所要求的内容并不存在,因为代理人的实施方式并非如此。
答案 1 :(得分:3)
查看respondsToSelector
上的文档 - 它使您能够测试并查看对象是否会响应选择器:)
答案 2 :(得分:2)
我猜UITableView的做法是这样的:
if ([delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) {
[delegate tableView:self viewForHeaderInSection:section];
} else {
// Does its own thing instead
}
所以我认为你不可能以这种方式获得原始的。