代表们,无法理解他们

时间:2009-11-24 20:45:37

标签: iphone objective-c delegates class-design

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

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

提前致谢!

4 个答案:

答案 0 :(得分:6)

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

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

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

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

}

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

答案 1 :(得分:2)

通常,如果您有一个可能必须从许多不同对象接收消息的委托方法,您只需将调用对象传递给消息中的委托(方法调用)。

例如,如果您希望委托方法从tableviewcell的标签中提取文本,则方法定义将类似于:

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

您可以从tableviewcell调用该方法:

[delegate extractTextFromLabelOfTableCell:self];

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

答案 2 :(得分:1)

委托是一种在没有子类化或将控制器附加到类的情况下向类添加行为的方法。

在您提供的表视图示例中,委托正在扩展或控制表,而不是单元格。该表设计为具有控制器,而单元则不是。此设计选择是您无法指定特定于单元格的委托的原因。

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

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

答案 3 :(得分:-1)