在继承的委托上解析不兼容的属性类型的语法

Rob*_*man 11 delegates protocols objective-c ios

我继承的一些代码有一个恼人的警告.它声明了一个协议,然后使用它来指定委托

@protocol MyTextFieldDelegate;

@interface MyTextField: UITextField
@property (nonatomic, assign) id<MyTextFieldDelegate> delegate;
@end

@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
- (void)myTextFieldSomethingHappened:(MyTextField *)textField;
@end
Run Code Online (Sandbox Code Playgroud)

使用myTextField实现的类,并使用MyTextFieldDelegate以下代码调用它:

if ([delegate respondsToSelector:@selector(myTextFieldSomethingHappened:)])
{
    [delegate myTextFieldSomethingHappened:self];
}
Run Code Online (Sandbox Code Playgroud)

这有效,但会创建(合法)警告:警告:属性类型'id'与从'UITextField'继承的类型'id'不兼容

以下是我提出的解决方案:

  1. 删除该属性.这有效,但我收到警告'-myTextFieldSomethingHappened:'在协议中找不到
  2. 完全放弃协议.没有警告,但如果忘记在委托中实现协议,也会丢失语义警告.

有没有办法定义委托属性,以便编译器满意?

mal*_*hal 31

尝试:

@property (nonatomic, assign) id<UITextFieldDelegate,MyTextFieldDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

  • 非常棒,完全有道理. (2认同)
  • 我终于(问了两年后,得到一个明确的答案后一年)在我的代码中解决这个问题.我只想说"现场并感谢". (2认同)

Max*_*Max 5

UITextField还有一个名为delegate的属性,但它有另一种类型.只需将您的delegate财产重命名为其他内容.