Ios 在类中对变量进行子类化

Ios 在类中对变量进行子类化,ios,swift,Ios,Swift,我试图更改类中变量的行为 更准确地说,我有一个“UIWebView”,它有一个“scrollview”属性 我需要覆盖这个scrollview的“setContentInset”,但是我不知道如何做 文档显示UIWebView具有以下功能: var scrollView: UIScrollView { get } 因此,我不能简单地创建自己的并将其设置在那里 我的问题是,如何从UIWebView的scrollview覆盖“setContentInset” 编辑: 2澄清 我知道UIWebVie

我试图更改类中变量的行为

更准确地说,我有一个“UIWebView”,它有一个“scrollview”属性

我需要覆盖这个scrollview的“setContentInset”,但是我不知道如何做

文档显示UIWebView具有以下功能:

var scrollView: UIScrollView { get }
因此,我不能简单地创建自己的并将其设置在那里

我的问题是,如何从UIWebView的scrollview覆盖“setContentInset”

编辑:

2澄清

我知道UIWebView不应该是子类的,按照文档的说明


我的目标是修复我已经在我的应用程序的其他ScrollView上实现的“下拉刷新”跳跃行为。

当一个内置接口类“有”另一个内置接口类时,你不能对内部类进行子类化或重写任何相关内容

因此,尽管可以将UIWebView子类化,但无法以某种方式将UIWebView的滚动视图子类化


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

当一个内置接口类“有”另一个内置接口类时,您不能对内部类进行子类化或重写其任何内容

因此,尽管可以将UIWebView子类化,但无法以某种方式将UIWebView的滚动视图子类化


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

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

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
的setter中使用它

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) }
    }
}

即使这样也可能不够。在处理内部对象时,运行时可以通过多种方式进行欺骗。这应该足够让你开始了。

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

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
的setter中使用它

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) }
    }
}

即使这样也可能不够。在处理内部对象时,运行时可以通过多种方式进行欺骗。我不知道您是否可以实现您想要的,但是作为一个解决方案,考虑扩展<代码> UISCRoopVIEW委托> <代码>协议,以添加委托方法<代码> ScRabVIEWDIDSET CSENTROSENSET(UISCRelVIEW)< /C>然后扩展<代码> UISCRelVIEW 每当代码< > CordNoSt/<代码>被设置。我不知道您是否可以实现您想要的,但是作为一种解决方案,考虑扩展<代码> UISCRoopVIEW委托/<代码>协议,以添加委托方法<代码> ScReVIEWDIDSET CSENTROSENSET(UISCRelVIEW)< /代码>,然后扩展
UIScrollView
以在设置
contentInset
时调用它。覆盖
UIButton
titleLabel
imageView
,这是很困难的,但这是因为按钮状态不同。我已经成功地覆盖了
UITableViewCell
子类中的
textlab
imageView
。覆盖
滚动视图
时会出现什么问题?覆盖
ui按钮
标题标签
图像视图
会很棘手,但这是因为按钮状态不同。我已经成功地覆盖了
UITableViewCell
子类中的
textlab
imageView
。覆盖
scrollView
时会出现什么问题?