在类中对变量进行子类化

时间:2016-12-28 01:02:43

标签: ios swift

我试图改变一个类中变量的行为。

更确切地说,我有一个' UIWebView'它有一个' scrollview'属性。

我需要覆盖' setContentInset'这个卷轴视图,但我不知道如何做到这一点。

文档告诉我UIWebView有这个:

var scrollView: UIScrollView { get }

所以我不能简单地创建自己的并将其设置在那里。

我的问题是,如何覆盖' setContentInset'来自UIWebView的scrollview?

修改

2澄清。

我知道根据文档subclassing notes,UIWebView不应该是子类。

我的目标是修复"拉下来刷新"我已经在我的应用程序的其他滚动视图中实现的this answer之后的跳跃行为。

2 个答案:

答案 0 :(得分:0)

当内置接口类“拥有”另一个内置接口类时,你不能继承内部类或覆盖它的任何内容。

因此,虽然您可以继承UIWebView,但您无法以某种方式继承UIWebView的滚动视图。

另一个熟悉的例子是UIButton。每个人都知道UIButton包含一个UILabel和一个UIImageView。您可以继承UIButton,但不能将其UILabel或UIImageView子类化。

答案 1 :(得分:0)

我会从一个直接的方法开始,看看是否有任何微妙的问题。

class MyScrollView: UIScrollView {
    private lazy var my_contentInset: UIEdgeInsets = UIEdgeInsets()
    override var contentInset: UIEdgeInsets {
        get { return my_contentInset }
        set {
            // Your willSet code
            my_contentInset = newValue
            // Your didSet code
        }
    }
}

class MyWebView: UIWebView {
    private lazy var my_scrollView: MyScrollView = MyScrollView()
    override var scrollView: UIScrollView {
        get { return my_scrollView }
    }
}

这有点过于简单,因此您可能会遇到问题,具体取决于运行时如何设置scrollView。如果运行时需要scrollView的setter,那么您需要更深入。

在这里,我为滚动视图创建了一个初始值设定项,用于克隆UIScrollView并在MyWebView scrollView的设置器中使用该初始值设定项。

extension MyScrollView {
    convenience init(scrollView: UIScrollView) {
        let data = NSKeyedArchiver.archivedData(withRootObject: scrollView)
        let coder = NSKeyedUnarchiver(forReadingWith: data)
        self.init(coder: coder)! // Intentionally failing hard on decode failure.

        // Additional configuration not captured in the encode/decode
        // process might be needed.
    }
}

class MyWebView: UIWebView {
    private lazy var my_scrollView: MyScrollView = MyScrollView()
    override var scrollView: UIScrollView {
        get { return my_scrollView }
        set { my_scrollView = MyScrollView(scrollView: newValue) }
    }
}

即使这可能还不够。在处理内部对象时,运行时可以通过多种方式作弊。它应该足以让你开始。