在 Swift4 中未调用 forwardingTarget

Posted

技术标签:

【中文标题】在 Swift4 中未调用 forwardingTarget【英文标题】:forwardingTarget not called in Swift4 【发布时间】:2018-05-13 17:35:28 【问题描述】:

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

// 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:

这个项目是作为开源创建的。 ReusableScrollView

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

【问题讨论】:

仅供参考 - 扩展实际上并不支持覆盖方法。它在 Swift 书中明确说明。请参阅Extensions 章节开头的第一个注释。 【参考方案1】:

最初在我这样设置委托的代码中:

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
    

【讨论】:

以上是关于在 Swift4 中未调用 forwardingTarget的主要内容,如果未能解决你的问题,请参考以下文章

在 UICollectionViewController 中未调用 searchbarsearchbuttonclicked

在 PagedListAdapter 中未调用 onCreateViewHolder

在 iPad 中未调用supportedInterfaceOrientations

在 Android 中未调用 onlocationchanged

在 iOS 中未调用 textFieldShouldReturn

在 Playground Book 中未调用 pressesBegan