首页 > 解决方案 > 在 Swift4 中未调用 forwardingTarget

问题描述

我为可重复使用的滚动视图创建了项目,但我偶然发现了一个我很难弄清楚的问题。 forwardingTarget(for aSelector: Selector!)不知何故,它永远不会在 UIScrollView 的子类中调用。这是一个片段:

// MARK: Overriding

override open func responds(to aSelector: Selector!) -> Bool {

    let respondesToSelector: Bool = super.responds(to: aSelector) ||  _delegate?.responds(to: aSelector) == true

    return respondesToSelector
}

override open func forwardingTarget(for aSelector: Selector!) -> Any? {
    if _delegate?.responds(to: aSelector) == true {
        return _delegate
    }
    else {
        return super.forwardingTarget(for: aSelector)
    }
}

添加...还有另一个问题 - 例如scrollViewDidScroll未被捕获responds(to aSelector: Selector!)- 实际上几乎没有 UIScrollView 委托方法被它捕获。奇怪的是只有一种方法被捕获scrollViewWillEndDraggingWithVelocity:targetContentOffset:

该项目是作为开源创建的。可重用的滚动视图

我将感谢您的帮助,当然还有贡献。

标签: iosswiftuiscrollviewuikit

解决方案


最初在代码中我以这种方式设置了委托:

override weak open var delegate: UIScrollViewDelegate? {
    didSet {
        _delegate = delegate as? ReusableScrollViewDelegate
    }
}

这显然是不完整的。缺少与超类有关的代表。正确的实现如下

override weak open var delegate: UIScrollViewDelegate? {
    get {
        return _delegate
    }
    set {
        _delegate = newValue as? ReusableScrollViewDelegate
        super.delegate = self
    }
}

推荐阅读