【问题标题】:Is there a way to only allow UIViewControllers to adhere to a protocol?有没有办法只允许 UIViewControllers 遵守协议?
【发布时间】:2012-11-22 23:11:14
【问题描述】:

有没有办法做这样的事情(下面不起作用):

@protocol ElementPicker <UIViewController>

- (id)initWithFile:(NSFileWrapper *)file andInfo:(NSString *)info;

@property (nonatomic, weak) NSObject<ElementPickerDelegate> *delegate;
@end

所以实现“ElementPicker”的对象必须继承自UIViewController

【问题讨论】:

    标签: objective-c ios uiviewcontroller objective-c-protocol


    【解决方案1】:

    没有。协议只能扩展其他协议。您可以做的最接近的是将变量、属性或参数定义为同样遵守ElementPicker 协议的UIViewController。像这样的:

    - (void)someMethod:(UIViewController<ElementPicker> *)controller {
    }
    

    旁注 - 通常将委托定义为 id,而不是 NSObject。如:

    @property (nonatomic, weak) id<ElementPickerDelegate> delegate;
    

    【讨论】:

    • 好的,谢谢。在旁注 - 我发现当我将委托声明为 id 时,编译器抱怨 respondsToSelector: 没有被定义。
    • 通过确保您的委托协议扩展 NSObject 协议来解决这个问题:@protocol ElementPickerDelegate &lt;NSObject&gt;。请注意,有一个NSObject 类和一个NSObject 协议。
    【解决方案2】:

    我认为协议不能要求它是 UIViewController,但您可以通过设置要求委托是 UIViewController 轻松实现这一点:

    @property (nonatomic, weak) UIViewController&lt;ElementPickerDelegate&gt; *delegate;

    【讨论】:

    • 我指的是@protocol ElementPicker &lt;UIViewController&gt; 部分。委托只是协议的要求。 &lt;UIViewController&gt; 不起作用。
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多