如果代理不在那里,如何调用将被调用的方法

时间:2009-08-27 02:51:28

标签: objective-c cocoa

我正在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做任何事情,如果没有实现可选方法呢?我不是很有希望,但如果可能的话会很酷。

3 个答案:

答案 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
}

所以我认为你不可能以这种方式获得原始的。