我继承的一些代码有一个恼人的警告。它声明了一个协议,然后使用它来指定委托
@protocol MyTextFieldDelegate;
@interface MyTextField: UITextField
@property (nonatomic, assign) id<MyTextFieldDelegate> delegate;
@end
@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
- (void)myTextFieldSomethingHappened:(MyTextField *)textField;
@end
使用myTextField
的类实现MyTextFieldDelegate
并使用此代码调用它:
if ([delegate respondsToSelector:@selector(myTextFieldSomethingHappened:)])
{
[delegate myTextFieldSomethingHappened:self];
}
这有效,但会创建(合法)警告:警告:属性类型'id'与从'UITextField'继承的类型'id'不兼容
以下是我提出的解决方案:
有没有办法定义委托属性,以便编译器满意?
答案 0 :(得分:30)
尝试:
@property (nonatomic, assign) id<UITextFieldDelegate,MyTextFieldDelegate> delegate;
答案 1 :(得分:5)
UITextField还有一个名为delegate的属性,但它有另一种类型。只需将delegate
属性重命名为其他内容即可。
答案 2 :(得分:4)
在UITableView.h中找到答案。
UIScrollView具有属性名称委托,UITableView具有相同的名称属性。
@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
// Your code
......
@end
答案 3 :(得分:2)
最初的问题是,在声明委托属性期间,没有关于MyTextFieldDelegate继承的信息。它是由协议的前向声明引起的(@protocol MyTextFieldDelegate;)。
我遇到了同样的问题,但在其他.h文件中使用了协议声明。在我的情况下,解决方案只是#import适当的标题。
在您的情况下,您只需要交换声明的顺序:
@class MyTextField;
@protocol MyTextFieldDelegate <UITextFieldDelegate>
@optional
- (void)myTextFieldSomethingHappened:(MyTextField *)textField;
@end
@interface MyTextField : UITextField
@property (nonatomic, assign) id <MyTextFieldDelegate> delegate;
@end