【问题标题】:Overriding delegate property in a UIScrollView subclass覆盖 UIScrollView 子类中的委托属性
【发布时间】:2015-06-20 05:23:21
【问题描述】:

我有一个滚动视图子类,它带有一个扩展 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 显然我可以将委托属性命名为其他名称,但如果可能的话,我想避免这种情况。

【问题讨论】:

    标签: ios objective-c inheritance delegates subclass


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-11-01
        • 1970-01-01
        • 2016-09-04
        • 2015-10-28
        • 2012-10-01
        • 1970-01-01
        • 2015-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多