不能子类化 WKWebView

tou*_*per 6 subclass init ios swift wkwebview

我正在尝试对 WKWebView 进行子类化。当我实现自己的初始化程序时,出现此错误:

'required' initializer 'init(coder:)' must be provided by subclass of 'WKWebView'
Run Code Online (Sandbox Code Playgroud)

好的,众所周知,我们必须为 UIView 的子类实现它。对于 UIView 的直接子类,它只是实现它,但对于 WKWebView,它似乎并不那么简单。我遵循了 Fix-it 提示,并将此代码段添加到代码中:

required @availability(*, unavailable) convenience init!(coder: NSCoder!) {
        fatalError("init(coder:) has not been implemented")
    }
Run Code Online (Sandbox Code Playgroud)

所以我得到一个如下所示的类:

import WebKit


class TSWebView : WKWebView {

    let s: String
    let i: Int

    init(s: String, i: Int) {
        self.s = s
        self.i = i
        super.init(frame: CGRectZero, configuration: WKWebViewConfiguration())
    }

    required @availability(*, unavailable) convenience init!(coder: NSCoder!) {
        fatalError("init(coder:) has not been implemented")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我遇到了其他四个错误:

expected declaration
    required @availability(*, unavailable) convenience init!(coder: NSCoder!) {

consecutive declarations on a line must be separated by ';'
    required @availability(*, unavailable) convenience init!(coder: NSCoder!) {

cannot override 'init' which has been marked unavailable
    required @availability(*, unavailable) convenience init!(coder: NSCoder!) {

'required' modifier must be present on all overrides of a required initializer
    required @availability(*, unavailable) convenience init!(coder: NSCoder!) {
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我的 Xcode 版本是 6.1.1 (6A2008a)。非常感谢。

Jos*_*lff 5

只需像这样覆盖常规初始化即可。这对我有用,Swift 5。

override init(frame: CGRect, configuration: WKWebViewConfiguration) {
    super.init(frame: frame, configuration: configuration)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*rry 2

尝试去掉多余的装饰:

import WebKit

class TSWebView : WKWebView {

    let s: String
    let i: Int

    init(s: String, i: Int) {
        self.s = s
        self.i = i
        super.init(frame: CGRectZero, configuration: WKWebViewConfiguration())
    }

    convenience init!(coder: NSCoder!) {
        super.init(coder:coder)
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管我猜测“availability(*, unavailable)”的全部意义在于使您无法调用初始化程序(因此无法有效地子类化 WKWebView.