我有一个滚动视图子类,其中包含一个扩展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显然我可以将委托属性命名为其他内容,但如果可能的话,我想避免这种情况。
答案 0 :(得分:1)
它是这样的,但从设计的角度来看似乎不是好的解决方案
- (void)setDelegate:(id<ScrollViewSubclassDelegate>)delegate
{
if (![self.delegate isEqual:delegate]) {
[super setDelegate:delegate];
}
}
答案 1 :(得分:0)
您无法访问超类的私有ivar。如果您希望超类仍然能够完成所有自己的委托逻辑,那么您应该在子类setter中调用[super setDelegate:delegate]
。