swift - 在 Swift 中,我如何拥有一个具有内部和外部委托(delegate)的 UIScrollView 子类?

标签 swift uiscrollview delegates

我将 UIScrollView 子类化以添加一些功能,例如双击缩放和用于图库目的的图像属性。但是为了完成图像部分,我的子类必须是它自己的委托(delegate)并实现 viewForZoomingInScrollView

但是当有人使用我的 ScrollView 子类时,他们可能也希望获得委托(delegate)通知以查看 scrollViewDidScroll 或您有什么。

在 Swift 中,我如何获得这两个?

最佳答案

这是此模式的 Swift 版本:

尽管 forwardInvocation: 在 Swift 中被禁用,我们仍然可以使用 forwardingTargetForSelector:

class MyScrollView: UIScrollView {

    class _DelegateProxy: NSObject, UIScrollViewDelegate {
        weak var _userDelegate: UIScrollViewDelegate?

        override func respondsToSelector(aSelector: Selector) -> Bool {
            return super.respondsToSelector(aSelector) || _userDelegate?.respondsToSelector(aSelector) == true
        }

        override func forwardingTargetForSelector(aSelector: Selector) -> AnyObject? {
            if _userDelegate?.respondsToSelector(aSelector) == true {
                return _userDelegate
            }
            else {
                return super.forwardingTargetForSelector(aSelector)
            }
        }

        func viewForZoomingInScrollView(scrollView: MyScrollView) -> UIView? {
            return scrollView.viewForZooming()
        }

        // Just a demo. You don't need this.
        func scrollViewDidScroll(scrollView: MyScrollView) {
            scrollView.didScroll()
            _userDelegate?.scrollViewDidScroll?(scrollView)
        }
    }

    private var _delegateProxy =  _DelegateProxy()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        super.delegate = _delegateProxy
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        super.delegate = _delegateProxy
    }

    override var delegate:UIScrollViewDelegate? {
        get {
            return _delegateProxy._userDelegate
        }
        set {
            self._delegateProxy._userDelegate = newValue;
            /* It seems, we don't need this anymore.
            super.delegate = nil
            super.delegate = _delegateProxy
            */
        }
    }

    func viewForZooming() -> UIView? {
        println("self viewForZooming")
        return self.subviews.first as? UIView // whatever
    }

    func didScroll() {
        println("self didScroll")
    }
}

关于swift - 在 Swift 中,我如何拥有一个具有内部和外部委托(delegate)的 UIScrollView 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26953559/

相关文章:

c# - 5 个参数的函数

swift - 如何使用 Swift 从表格中的 HTML 类中检索标签

ios - Firebase Swift childByAutoId()

iphone - 将 UIViewcontroller 添加到 UIScrollview

ios - UITableViewCell 的 XIB 中的多个 UIView

ios - 当 ScrollView subview 不在屏幕上时手势识别器不工作

ios - 在 Swift 中显示来自 SQLite Blob 的图像

ios - 带顶栏的 3D Touch Peek

c# - 有没有办法在设置类的任何属性时调用方法?

C# 操作和 GC