【问题标题】:Having an ivar 'delegate' in a subclass whose superclass also has same named ivar在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”
【发布时间】:2026-01-27 17:40:01
【问题描述】:

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

@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&lt;UMTextViewDelegate&gt;' is incompatible with type 'id&lt;UITextViewDelegate&gt;' inherited from 'UITextView'

如何抑制此警告?我尝试添加这个:

@protocol UMTextViewDelegate <NSObject, UITextViewDelegate>

但没有运气。 !!

编辑:

我没有使用 ARC

【问题讨论】:

    标签: ios xcode delegates warnings uitextviewdelegate


    【解决方案1】:

    您遇到的问题是关于前向声明。在您声明delegate 的地方,编译器不知道UMTextViewDelegateUITextViewDelegate 的后代。它唯一知道的是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

      【讨论】:

        最近更新 更多