在子类中有一个ivar'委托',其超类也具有相同的名称ivar

时间:2013-03-31 00:37:41

标签: ios xcode delegates warnings uitextviewdelegate

我有一个像这样定义的子类

@protocol UMTextViewDelegate;

@interface UMTexView : UITextView <UITextViewDelegate> {

}

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

@end

@protocol UMTextViewDelegate <NSObject>
@optional
- (void)textViewDidSelectWordToDefine:(UMTexView*)textView;
@end

但我收到警告Property type 'id<UMTextViewDelegate>' is incompatible with type 'id<UITextViewDelegate>' inherited from 'UITextView'

如何取消此警告?我尝试添加这个:

@protocol UMTextViewDelegate <NSObject, UITextViewDelegate>

但没有运气。 !

编辑:

我没有使用ARC

2 个答案:

答案 0 :(得分:0)

您遇到的问题是前向声明。在您声明delegate的位置,编译器不知道UMTextViewDelegate来自UITextViewDelegate。它唯一知道的是UMTextViewDelegate是一个协议。

你必须为类@class UMTexView;创建一个前向声明,然后放入协议声明,然后是类声明。

另外,显然UMTexView应该是自己的文本委托。也许让UMTexView直接从UIView下降并在其中放置UITextView会更容易。那么你就不会遇到代理冲突的问题,而且UITextViewDelegate在外部是不可访问的。

答案 1 :(得分:0)

使用@ Sulthan的回答,这就是我想出来的,它压制了警告。

@class UMTextView;

@protocol UMTextViewDelegate <NSObject, UITextViewDelegate>
@optional
- (void)textViewDidSelectWordToDefine:(UMTextView*)textView;
@end

@interface UMTextView : UITextView <UITextViewDelegate>

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

@end

UMTextView的前向声明后跟协议声明告诉UMTextView UMTextViewDelegate确实来自UITextViewDelegate。这样我就不必添加uiview,然后在该视图中添加uitextview