错误:[UIPopoverBackgroundView setArrowOffset:] 必须由子类实现



我按照这篇文章实现了UIPopoverBackgroundView。我检查了UIPopoverBackgroundView类,我想我已经实现了所有必需的函数和变量,但是运行时错误仍然存在。

由于未捕获的异常而终止应用 'NSInternalInconsistencyException', reason: '-[UIPopoverBackgroundView setArrowOffset:] 必须由子类器实现。

import UIKit
class CustomPopoverBackground: UIPopoverBackgroundView {
    override func layoutSubviews() {
        super.layoutSubviews()
    }
    override var arrowOffset: CGFloat {
        get {
            return 0.0
        }
        set {
            super.arrowOffset = newValue
        }
    }
    override var arrowDirection: UIPopoverArrowDirection {
        get {
            return UIPopoverArrowDirection.Up
        }
        set {
            super.arrowDirection = newValue
        }
    }
    override class func contentViewInsets() -> UIEdgeInsets {
        return UIEdgeInsetsMake(10, 10, 10, 10)
    }
    override class func arrowBase() -> CGFloat {
        return 2.0
    }
    override class func arrowHeight() -> CGFloat {
        return 2.0
    }
}

我哪里错了?setArrowOffset是什么,我在UIPopoverBackgroundView类或UIPopoverBackgroundViewMethods协议中没有找到它。

另一篇实际展示自定义UIPopOverBackgroundView实现的博客文章

它将箭头保存在结构中

private struct Arrow {
    let height    : CGFloat   = 30.0
    let base      : CGFloat   = 20.0
    var direction : Direction = .UP
    var offset    : CGFloat   = 0.0
}
override var arrowOffset: CGFloat {
    get {
        return arrow.offset
    }
    set {
        arrow.offset = newValue
    }
}

这里没有超级调用,类期望子类实际保存值而不是使用超类实现。

最新更新