我试图改变一个类中变量的行为。
更确切地说,我有一个' UIWebView'它有一个' scrollview'属性。
我需要覆盖' setContentInset'这个卷轴视图,但我不知道如何做到这一点。
文档告诉我UIWebView有这个:
var scrollView: UIScrollView { get }
所以我不能简单地创建自己的并将其设置在那里。
我的问题是,如何覆盖' setContentInset'来自UIWebView的scrollview?
修改
2澄清。
我知道根据文档subclassing notes,UIWebView不应该是子类。
我的目标是修复"拉下来刷新"我已经在我的应用程序的其他滚动视图中实现的this answer之后的跳跃行为。
答案 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) }
}
}
即使这可能还不够。在处理内部对象时,运行时可以通过多种方式作弊。它应该足以让你开始。