覆盖UIScrollView子类中的委托属性

时间:2015-04-14 14:30:54

标签: ios objective-c inheritance delegates subclass

我有一个滚动视图子类,其中包含一个扩展UIScrollViewDelegate的自定义委托。为了与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显然我可以将委托属性命名为其他内容,但如果可能的话,我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您无法访问超类的私有ivar。如果您希望超类仍然能够完成所有自己的委托逻辑,那么您应该在子类setter中调用[super setDelegate:delegate]