【问题标题】:Why use protocol, not call the method directly?为什么使用协议,而不是直接调用方法?
【发布时间】:2013-07-09 00:54:06
【问题描述】:

例如:UITableviewDelegate 协议有tableView:didSelectRowAtIndexPath:。为什么让它成为协议中的委托方法而不是UITableView类中的方法并直接调用它?

【问题讨论】:

  • 所以你不必为了做一个像自定义单元格这样的小任务而对整个 UITableView 类进行子类化。此外,它还允许您更好地解耦代码 IMO。

标签: ios uitableview delegates protocols delegation


【解决方案1】:

它实际上是在UITableViewDataSource 而不是委托,这是一个重要的区别。

委托的目的是将某事的责任转移给客户端代码。 UITableView 本身不知道它需要创建什么类型的单元格。您的应用程序是知道细胞应该是什么样子以及它们如何工作的应用程序。这就是tableView 要求数据源(由协议定义)创建单元格的原因。

在 Apple 框架中,delegate 通常用于监听对象事件,dataSource 用于为某事提供内容。两者都是委托模式的形式。

如果您之所以问是因为您想问一个表格视图 - “那个索引路径上的单元格是什么?”你可以使用实例方法cellForRowAtIndexPath

【讨论】:

    【解决方案2】:

    因为您可能希望一个不同的类作为UITableViewController 中表格视图的数据源。

    这里有一个简单但有些人为的例子来说明......

    假设您有一个视图控制器,其中包含两个表视图,显示 DataA 和 DataB,您可以按每个表旁边的按钮转到该表全屏的另一个视图。您可以将其设置为具有两个 UITableViews 和两个 UIButtons 以及第二个控制器 MyFullScreenTableViewController 的视图控制器,这是一个 UITableViewController 子类,然后您将拥有两个完全独立的对象,一个是数据源用于 DataA 表,一个是 DataB 表的数据源。因此,这些对象在第一个视图中为两个表提供了单元格,它们还在全屏控制器中提供了单元格 - 您可以根据它正在查看的表传入正确的数据源。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2016-02-08
      • 2011-08-21
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多