一个对象可以成为多个委托者的委托吗?

时间:2009-08-12 06:43:38

标签: iphone objective-c delegates

我不确定我的术语,但是:

我在iPhone应用程序中有一个ViewController,需要成为另外两个对象(委托人)的委托。

这可能吗?这不起作用:

@interface my_projectViewController : UIViewController <DelegatorOne> <DelegatorTwo> {
  ...
}

5 个答案:

答案 0 :(得分:24)

正确的复数是委托,是的,绝对可以让你的班级成为不同协议的代表。

语法如下:

@interface my_projectViewController : UIViewController <DelegatorOne, DelegatorTwo> {
  ...
}

我有一个看起来像这样的人:

@interface MyViewController : UIViewController<UITextFieldDelegate,UIWebViewDelegate,UINavigationBarDelegate,UIActionSheetDelegate,URLDownloaderDelegate> {

}

致以最诚挚的问候,

答案 1 :(得分:6)

稍微迂腐但重要的区别:您在问题中提供的不是作为多个委托者的委托的对象,而是符合多个协议的对象。在大多数情况下,委托将拥有与之关联的协议(UIActionSheetDelegate,UITextFieldDelegate),但并非所有委托都有协议,并非所有协议都暗示代理。

在一个非常人为的例子中,你可以有一个委托给另一个符合没有协议的对象的对象:

#import "ObjectB.h"

@interface ObjectA : NSObject {
    ObjectB *delegate;
}
@end

// ...

@interface ObjectB : NSObject { }
 - (void)delegateMethod;
@end

在这个例子中,ObjectA的实例期望ObjectB的实例作为它们的“委托”,即使ObjectB不是真正的协议,而是类接口!作为委托的对象的存在更多的是一个心灵的框架,而不是一个严格的协议要求 - 只是大多数(好的,几乎所有)开发人员将采取委托方法并将它们分解为一个协议,以便多个对象可以成为ObjectA实例的委托,而不是要求委托是ObjectB的实例(或子类)。这也消除了ObjectA在#import其头文件意义上“了解”ObjectB的需要。

在一个稍微不那么做作的例子中,一个对象可以在不作为委托的情况下符合协议。将NSCopying协议视为一个很好的例子 - 协议所说的所有实现它的对象都可以使用copy方法进行复制。人们不认为copy是一个“委托”方法,因为没有对象只是说[delegate copy]而没有对该副本做某事,所以实现NSCopying的对象实际上不是“委托”对象

最后,请记住:协议并不意味着委托,委托并不总是(但通常会)暗示协议

答案 2 :(得分:3)

您的语法不太正确,但很有可能让一个对象充当多个客户端的委托。

类似的东西:

@interface MyViewController: UIViewController <protocol1, protocol2> 
{
}
@end

......应该有效

答案 3 :(得分:2)

除了关于实现多个委托协议的说法之外,Cocoa的委托模式使对象很容易成为同一类型的多个对象的委托。这就是为什么大多数委托方法都包含一个指向调用对象的指针作为参数或NSNotification的对象。您可以使用它来获取有关该对象的更多信息,或将其与实例变量进行比较,以确定要采取的操作。

答案 4 :(得分:0)

我曾经在我的一个项目中使用Multicast Delegate方法。看看Multicast Delegates in Cocoa