覆盖 UIScrollView 子类中的委托 属性

Overriding delegate property in a UIScrollView subclass

我有一个滚动视图子类,它带有一个扩展 UIScrollViewDelegate 的自定义委托。我也想将其命名为 属性 'delegate',以便与 Apple 的模式保持一致。这是我正在尝试做的一个例子:

@protocol ScrollViewSubclassDelegate <UIScrollViewDelegate, UITextFieldDelegate>
- (void)additionalDelegateMethod;
@end

@interface ScrollViewSubclass : UIScrollView
@property (nonatomic, weak) id<ScrollViewSubclassDelegate> delegate;
@end

我还在实现中覆盖了 setDelegate 方法,因为我想让该委托成为 UITextField 子视图的委托。例如:

@implementation ScrollViewSubclass

- (void)setDelegate:(id<ScrollViewSubclassDelegate>)delegate
{
    if (![_delegate isEqual:delegate]) {
        _delegate = delegate;
        self.myTextField.delegate = delegate;
    }
}

@end

但是,当我这样做时,出现以下错误:

Undefined symbols for architecture x86_64:
  "_OBJC_IVAR_$_UIScrollView._delegate", referenced from:
      -[ScrollViewSubclass setDelegate:] in ScrollViewSubclass.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我试过添加 @synthesize delegate;@dynamic delegate;,正如其他一些 SO 帖子提到的那样,但都没有用。

任何有关如何执行此操作的建议将不胜感激。

PS 显然我可以将代表命名为 属性 其他名称,但我想尽可能避免这种情况。

您无法访问超类的私有 ivar。如果您希望超类仍然能够执行它自己的所有委托逻辑,那么您应该在子类 setter.

中调用 [super setDelegate:delegate]

它是这样工作的,但从设计的角度来看似乎不是一个好的解决方案

- (void)setDelegate:(id<ScrollViewSubclassDelegate>)delegate
{
    if (![self.delegate isEqual:delegate]) {
        [super setDelegate:delegate];
    }
}