代码之家  ›  专栏  ›  技术社区  ›  Simon Woodside

如果委托不在那里,如何调用将被调用的方法

  •  3
  • Simon Woodside  · 技术社区  · 17 年前

    我正在CocoaTouchAPI上实现可选的委托方法。我想做的是,首先调用 如果我没有实现委托,则被调用…然后对结果进行更改…然后返回我的修改版本。

    下面是一个例子:

    - (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 回复  |  直到 15 年前
        1
  •  6
  •   Rob Napier    17 年前

    如果不实现委托,则不会调用任何方法。委托不像子类,它们不是语言特性。uiTableView(在本例中)执行一些操作,查看其-delegate属性是否为非零(这只是一个碰巧被称为“delegate”的随机ivar),如果看到委托实现了delegate方法,则调用它(如果执行了),然后再执行一些操作。

    uiTableView不公开默认的节头视图(我相信它是一个名为uisectionheadercell的私有子类),所以苹果没有承诺它是如何实现的。或者给我们一个很好的方法让我们了解这个问题,有几种方法让我们了解这个问题,但是苹果还没有给我们任何我知道的支持的方法。

    但对于有关委托的一般问题,您所要求的并不存在,因为它不是如何实现委托的。

        2
  •  3
  •   fbrereto    17 年前

    查看文档 respondsToSelector --它使您能够测试并查看对象是否会响应选择器:)

        3
  •  2
  •   jbrennan    17 年前

    我猜UITableView会这样做:

    if ([delegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) {
        [delegate tableView:self viewForHeaderInSection:section];
    } else {
        // Does its own thing instead
    }
    

    所以我认为你不可能用这种方式得到最初的那个。