【问题标题】:Can an object be a delegate for multiple delegators?一个对象可以成为多个委托人的委托人吗?
【发布时间】:2009-08-12 06:43:38
【问题描述】:

我不确定我在这里的术语,但是:

我在 iPhone 应用中有一个 ViewController,它需要成为其他两个对象(委托者)的委托。

这可能吗?这不起作用:

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

【问题讨论】:

    标签: iphone objective-c delegates


    【解决方案1】:

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

    然而语法是这样的:

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

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

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

    最好的问候,

    【讨论】:

      【解决方案2】:

      有点迂腐但重要的区别:您在问题中提供的不是作为多个委托人的委托的对象,而是符合多种协议的对象。在大多数情况下,委托都会有与之关联的协议(UIActionSheetDelegate、UITextFieldDelegate),但并非所有委托都有协议,也并非所有协议都隐含委托。

      在一个非常人为的例子中,您可以将一个对象委托给另一个不符合任何协议的对象:

      #import "ObjectB.h"
      
      @interface ObjectA : NSObject {
          ObjectB *delegate;
      }
      @end
      
      // ...
      
      @interface ObjectB : NSObject { }
       - (void)delegateMethod;
      @end

      在这个例子中,ObjectA 的实例期望 ObjectB 的实例作为它们的“委托”,尽管 ObjectB 并不是真正的协议,而是一个类接口!对象作为委托的存在与其说是对协议的严格要求,不如说是一种思维框架——只是大多数(好吧,几乎所有)开发人员都会采用委托方法并将它们分解成一个协议,以便多个对象可以成为 ObjectA 实例的委托,而不是要求委托是 ObjectB 的实例(或子类)。从#importing 其头文件的意义上来说,这也消除了 ObjectA“了解”ObjectB 的需要。

      在一个稍微不那么做作的例子中,对象可以符合协议而不是委托。将 NSCopying 协议视为一个很好的例子——协议所说的只是实现它的对象,可以使用copy 方法复制。人们不认为copy 是一种“委托”方法,因为没有对象只会说[delegate copy] 而不对该副本进行操作,因此实现 NSCopying 的对象并不是真正的“委托”对象。

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

      【讨论】:

      • 当然,非正式协议也常用于委托,即当您没有明确指定协议所需的方法但希望知道方法名称时。 UIKit 和 AppKit 经常使用非正式协议,如果类不支持协议所需的消息,则只有无操作行为。
      • AlBlue:好点子!想到的一个例子是 NSXMLParser,它没有对应的 NSXMLParserDelegate 正式协议,但记录了一些 parser:did...: 方法。
      【解决方案3】:

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

      类似:

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

      ...应该可以工作

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多