代码之家  ›  专栏  ›  技术社区  ›  Ariel Malka

为什么UITableViewDataSource协议中的某些方法声明前面是“TableView:(UITableView*)TableView”?

  •  1
  • Ariel Malka  · 技术社区  · 15 年前

    这个问题的表述可能令人困惑。我确实理解为什么它对像 cellForRowAtIndexPath 要接收指针,请使用相关的UITableView。

    我不明白的是更客观的C语言:我想用这个特殊的方法来声明方法吗?

    例如,如果具有某些内部协议(例如,UITableViewDataSource)的对象(例如,UITableView)将使用特殊的引用方式向实现者发送消息。

    也就是说,UITableView没有将引用本身作为常规的Objective-C消息参数传递,而是使用了这种特殊的语法?

    1 回复  |  直到 15 年前
        1
  •  4
  •   Jasarien    15 年前

    编辑

    对这个答案的评论中有相当长的讨论,这就完善了最初的问题。我会在这里贴出一些要点来帮助其他可能有类似问题的人。

    这归结为两种方法之间的混淆,

    - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
    

    第一个方法是 UITableView 返回一个 UITableViewCell 对于给定的索引路径。在表视图对象上调用此方法。

    第二个方法是在 UITableViewDataSource 要求 UITababVIEW单元格 对于给定的索引路径。

    重要的区别是第一个被称为 在表视图实例上 通过任何可能需要引用表单元格的类,调用第二个 按表视图实例 在数据源类上要求在给定的索引路径上显示单元格。

    我希望这有帮助。


    Cocoa/Cocoa Touch中的大多数委托/数据源协议都遵循此模式。这是一种表达“这个表视图需要这个数据”的方式。

    考虑类似文本字段对象的内容。您可能有一个与许多文本字段对象的接口,所有这些对象都报告给同一个委托,以定义它们对某些操作的行为。通过将自身作为方法中的参数传递给委托,委托知道哪个文本字段正在调用该方法。

    我不确定我是否完全理解您的要求,但这是对象通知其委托/数据源哪个对象正在发送方法的方式。 在UITableView的情况下,这就不那么明显了,因为通常每个表视图控制器只有一个表视图,但是我给出的文本字段示例应该概述这一事实。