用于解决inheritance委托的不兼容属性types的语法

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

@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]; } 

这个工作,但创build(合法)的警告: 警告:属性types“id”与从“UITextField”inheritance的types“id”不兼容

以下是我提出的解决scheme:

  1. 删除该属性。 这工作,但我得到警告'-myTextFieldSomethingHappened:'没有在协议(S)
  2. 完全放弃协议。 没有警告,但是如果忘记在委托中实现协议,也会丢失语义警告。

有没有办法来定义委托属性,使编译器是快乐的?

尝试:

 @property (nonatomic, assign) id<UITextFieldDelegate,MyTextFieldDelegate> delegate; 

UITextField也有名为委托的属性,但它有另一种types。 只需将您的delegate属性重命名为其他名称。

在UITableView.h中find答案。

UIScrollView具有属性名称委托,并且UITableView具有相同的名称属性。

 @protocol UITableViewDelegate<NSObject, UIScrollViewDelegate> // Your code ...... @end 

原来的问题是,在委托属性的声明过程中没有关于MyTextFieldDelegateinheritance的信息。 这是由协议的前向声明(@protocol MyTextFieldDelegate;)造成的。

我遇到了同样的问题,但在其他.h文件中的协议声明。 在我的情况下,解决scheme只是#import适当的标题。

在你的情况下,你只需要交换声明的顺序:

 @class MyTextField; @protocol MyTextFieldDelegate <UITextFieldDelegate> @optional - (void)myTextFieldSomethingHappened:(MyTextField *)textField; @end @interface MyTextField : UITextField @property (nonatomic, assign) id <MyTextFieldDelegate> delegate; @end