当前位置: 首页 > 面试题库 >

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

锺威
2023-03-14
问题内容

我正在子类化UIScrollView中添加一些功能,例如双击缩放和用于图库目的的image属性。但是为了做图像部分,我的子类必须是自己的委托并实现viewForZoomingInScrollView

但是,当有人使用我的滚动视图子类时,他们可能还希望获得委托通知,以查看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")
    }
}


 类似资料:
  • 假设我们有一个垂直的(即flex-direction:column)flexbox容器,具有给定的宽度和高度。flexbox包含div,每个div包含一个图像。 所有DIV和图像都应该以相同的百分比收缩/增长,以填充flexbox的高度,这是通过使用flex-shrink和/或Flex-Grow实现的。 所有图像都应该保持其纵横比(即不拉伸),这是通过不设置其css“width”属性来实现的。 每

  • 我试图在任意年份的经济衰退中计算复利。以下promise函数计算可变投资组合的发展。 编辑的清晰度: const是一个从1到20循环一年的数组(是静态的) 三元()在每次运行的不同年份触发,导致不同年份的

  • 我正在尝试使用JPA注释设计我的实体类。 我正在努力做的是: 具有 ID、***电子邮件、密码、activation_key、active、role***的用户表 和许多类型的用户表。 student_table user_id第一名最后一名公司地址等 MENTOR user_id第一名最后一名DOB部门等 当用户注册时,根据他们的角色,他们将被分为两个表(用户、导师/学生) 当它们登录时,Man

  • 问题内容: 有人可以解释何时以及何时不使用Swift中的委托指针进行“弱”分配,为什么? 我的理解是,如果您使用的协议未定义为类,则无法,也不想将您的委托指针分配给弱。 但是,当您的协议定义为类类型协议时,您是否要将委托设置为弱指针? 我对么?在Apple的快速指南中,类协议示例没有使用弱分配,但是在我的测试中,如果没有弱引用我的委托人,我会看到强参考周期。 问题答案: 通常,使类协议(如用关键字

  • 问题内容: 如果我有一个内部类的实例,如何 从不在内部类中的代码 访问外部 类 ?我知道在内部类中,我可以用来获取外部类,但是我找不到任何外部方式来获取此类。 例如: 问题答案: 该类的字节码将包含一个名为type 的包作用域。这就是用Java实现非静态内部类的方式,因为在字节码级别上没有内部类的概念。 如果您确实愿意,您应该能够使用反射来读取该字段。我从来不需要这样做,因此最好更改设计以使其不再