在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”
Posted
技术标签:
【中文标题】在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”【英文标题】:Having an ivar 'delegate' in a subclass whose superclass also has same named ivar 【发布时间】:2013-03-31 00:37:40 【问题描述】:我有一个像这样定义的子类
@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
【问题讨论】:
【参考方案1】:您遇到的问题是关于前向声明。在您声明delegate
的地方,编译器不知道UMTextViewDelegate
是UITextViewDelegate
的后代。它唯一知道的是UMTextViewDelegate
是一个协议。
你必须为类@class UMTexView;
创建一个前向声明,然后放置协议声明,然后是类声明。
在单独的注释中,很明显UMTexView
应该是其自身的文本委托。也许让UMTexView
直接从UIView
下降并在其中放入UITextView
会更容易。这样您就不会遇到委托冲突的任何问题,并且 UITextViewDelegate
将无法从外部访问。
【讨论】:
【参考方案2】:使用@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
。
【讨论】:
以上是关于在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”的主要内容,如果未能解决你的问题,请参考以下文章