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

时间:2011-11-18 20:27:54

标签: objective-c ios delegates protocols

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

@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'不兼容

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

  1. 删除该属性。这有效,但我收到警告' - myTextFieldSomethingHappened:'未在协议中找到
  2. 完全删除协议。没有警告,但如果您忘记在委托中实施协议,也会丢失语义警告。
  3. 有没有办法定义委托属性,以便编译器满意?

4 个答案:

答案 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