【问题标题】:Delegates, can't get my head around them代表们,我无法理解他们
【发布时间】:2009-11-24 20:45:37
【问题描述】:

您好,我正在寻找有关代表的有用资源。我知道代表坐在后台并在某些事情发生时接收消息 - 例如。选择表格单元格,或检索来自网络连接的数据。

我特别想知道的是如何将委托与多个对象一起使用。据我所知,为对象(例如表格单元格)指定相同的委托会导致同时为两个单元格调用相同的事件。有什么相当于为特定对象实例化委托的方法吗?

提前致谢!

【问题讨论】:

    标签: iphone objective-c delegates class-design


    【解决方案1】:

    在 Cocoa 中,对象几乎总是在调用委托方法时标识自己。例如,UITableView 在调用时将自己作为委托消息的第一个参数传递:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    

    如果您希望同一个委托处理多个 UITableView,那么您只需要对传递给该方法的 tableView 对象设置一些条件:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if (tableView == self.myFirstTableView) {
            // do stuff
        } else if (tableView == self.mySecondtableView) {
            // do other stuff
        }
    }
    

    }

    如果您不想直接比较对象指针,您始终可以使用tag 属性来唯一标识您的视图。

    【讨论】:

      【解决方案2】:

      通常,如果您的委托方法可能需要接收来自许多不同对象的消息,您只需让调用对象在消息中将自身传递给委托(方法调用)。

      例如,如果您希望委托方法从 tableviewcell 的标签中提取文本,则方法定义如下所示:

      -(void) extractTextFromLabelOfTableCell:(UITableViewCell *) theCallingCell{
      ...
      NSString *extractedText=theCallingCell.textLabel.text;
      }
      

      因此,您将从 tableviewcell 调用该方法:

      [delegate extractTextFromLabelOfTableCell:self];
      

      tableviewcell 的每个实例都会将自身发送给委托,委托会提取该实例的文本。通过这种方式,单个委托对象可以处理任意数量的单元格。

      【讨论】:

        【解决方案3】:

        委托是一种向类添加行为而不进行子类化或将控制器附加到类的方法。

        在您给出的表格视图示例中,委托正在扩展或控制表格,而不是单元格。表被设计成有一个控制器,单元格没有。这种设计选择是您不能指定特定于单元格的委托的原因。

        但是,委托方法将始终声明源对象(委托所附加的对象)和相关参数(如所涉及的单元格),因此您应该始终能够完全处理该操作。

        在您的情况下,如果您有一个单元格并且您希望该单元格自行管理,那么委托方法(可能会在您的 UITableViewController 上实现)可以简单地使用它的 @ 从源表中获取单元格987654322@(作为参数传递给委托方法)并调用单元子类上的方法来完成其工作。

        【讨论】:

          【解决方案4】:

          【讨论】:

          • 问题是,“委托”在 Cocoa 用语中的含义与在 .NET Framework 中的含义并不完全相同。
          • 啊,是的...没有看到问题上的“objective-c”标签。谢谢。
          猜你喜欢
          • 1970-01-01
          • 2019-07-27
          • 1970-01-01
          • 2018-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多