【问题标题】:Delegate after subclassing?子类化后委托?
【发布时间】:2011-12-05 17:16:00
【问题描述】:

对不起,我无法为标题制定一个简短的问题..

如果我使用委托协议和属性子类化一个类,我的委托是否仍需要实现超类的委托协议,还是必须为子类定义一个新协议?

在我的例子中,我继承了UIImagePickerController:

[(UIImagePickerController *)self.myUIImagePickerControllerSubclassInstance setDelegate:self];

当我尝试将其委​​托设置为 self 时,我从某个视图控制器收到以下警告:

警告:语义问题:将“ViewController *”发送到参数 不兼容的类型 “身份证”

【问题讨论】:

    标签: objective-c ios cocoa-touch delegation


    【解决方案1】:

    您的委托需要遵守UIImagePickerController 属性声明:

    @property (nonatomic, assign) id<UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate

    所以,尝试将<UIImagePickerControllerDelegate> 添加到您的子类接口:

    @interface YourPicker : UIImagePickerController <UIImagePickerControllerDelegate>
    ...
    @end
    

    您可能需要UINavigationControllerDelegate 并实施强制方法(如果有)。

    【讨论】:

    • 谢谢!我发现,只需将 UINavigationControllerDelegate 添加到我的 viewController 就可以了:@interface ViewController : UIViewController &lt;UIImagePickerControllerDelegate, UINavigationControllerDelegate&gt;
    【解决方案2】:

    是的,您的委托还必须与超类兼容。例如:

    @protocol MyWebViewDelegate<UIWebViewDelegate>
    {
         @optional
         -(void) myOptionalMethod1;
         -(void) myOptionalMethod2;
    
         @required
         -(void) myRequiredMethod1;
         -(void) myRequiredMethod2;
    }
    

    该协议扩展了 Web 视图委托,因此两者相互兼容。

    【讨论】:

    • 谢谢!所以这些是我的子类添加到超类的现有委托方法中的额外委托方法,对吧?
    猜你喜欢
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    相关资源
    最近更新 更多