在Swift中删除WKWebView Accesory栏

Edu*_*ard 9 objective-c ios swift

我现在正试着将这个转换成Swift而没有太多的背景.

这是我到目前为止所得到的...而且我一直在寻找谷歌并不知道要搜索什么才能更具体.你能否详细说明我做错了什么?谢谢

更新:

我已经找到了objective-c标签,因此更多与此线程相关的人可能能够看到它并希望得到答案.

在此输入图像描述

iam*_*ish 9

Michael Dautermann回答说得对,但是为了隐藏附件栏,你需要使用_NoInputAccessoryView类的inputAccessoryView()来调用UIView类的方法inputAccessoryView().我刚刚在代码中添加了几行额外的行来完成这个方法调配工作.

首先,你需要一个假类来交换

final class FauxBarHelper: NSObject {
    var inputAccessoryView: AnyObject? { return nil }
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器类中创建此方法

/// Removes the keyboard accessory view from the web view
/// Source: http://stackoverflow.com/a/32620344/308315 / http://stackoverflow.com/a/33939584/308315
func _removeInputAccessoryView(webView: UIWebView) {
    var targetView: UIView? = nil

    for view in webView.scrollView.subviews {
        if String(describing: type(of: view)).hasPrefix("WKContent") {
            targetView = view
        }
    }

    guard let target = targetView else { return }

    let noInputAccessoryViewClassName = "\(target.superclass!)_NoInputAccessoryView"
    var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName)
    if newClass == nil {
        let targetClass: AnyClass = object_getClass(target)
        newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cString(using: String.Encoding.ascii)!, 0)
    }

    let originalMethod = class_getInstanceMethod(FauxBarHelper.self, #selector(getter: FauxBarHelper.inputAccessoryView))
    class_addMethod(newClass!.self, #selector(getter: FauxBarHelper.inputAccessoryView), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
    object_setClass(target, newClass)
}
Run Code Online (Sandbox Code Playgroud)

HTH;)

  • 小记:在使用听写时,我遇到了这种方法的问题.从'UIDictationController`得到一个奇怪的崩溃.该`newClass`不是对象 - 可见,加入`objc_registerClassPair(的NewClass)``objc_allocateClassPair(...)`调用似乎解决这个问题之后. (4认同)

Osc*_*and 7

这是一个稍微更安全(没有不安全的展开)的版本,可与Swift 4和(至少)iOS 9槽12配合使用。

fileprivate final class InputAccessoryHackHelper: NSObject {
    @objc var inputAccessoryView: AnyObject? { return nil }
}

extension WKWebView {
    func hack_removeInputAccessory() {
        guard let target = scrollView.subviews.first(where: {
            String(describing: type(of: $0)).hasPrefix("WKContent")
        }), let superclass = target.superclass else {
            return
        }

        let noInputAccessoryViewClassName = "\(superclass)_NoInputAccessoryView"
        var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName)

        if newClass == nil, let targetClass = object_getClass(target), let classNameCString = noInputAccessoryViewClassName.cString(using: .ascii) {
            newClass = objc_allocateClassPair(targetClass, classNameCString, 0)

            if let newClass = newClass {
                objc_registerClassPair(newClass)
            }
        }

        guard let noInputAccessoryClass = newClass, let originalMethod = class_getInstanceMethod(InputAccessoryHackHelper.self, #selector(getter: InputAccessoryHackHelper.inputAccessoryView)) else {
            return
        }
        class_addMethod(noInputAccessoryClass.self, #selector(getter: InputAccessoryHackHelper.inputAccessoryView), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
        object_setClass(target, noInputAccessoryClass)
    }
}
Run Code Online (Sandbox Code Playgroud)


C. *_*ess 6

对于仍在寻找的人,WebKit团队进行了更新WKWebView(iOS 13+),因此您可以将其子类化以删除/更新输入的附件视图:

https://trac.webkit.org/changeset/246229/webkit#file1

在Swift中,我将其子类化,并返回nil。按预期工作。希望对您有所帮助。

仅供参考:我检查了文档,并且没有提及继承subclass WKWebView,因此允许继承子类。

import WebKit

class RichEditorWebView: WKWebView {

    var accessoryView: UIView?

    override var inputAccessoryView: UIView? {
        // remove/replace the default accessory view
        return accessoryView
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以在这里找到它的工作版本:https : //github.com/cbess/RichEditorView/commits/master

  • 非常感谢您将 RichEditorView 移植到 WKWebView 的工作...节省了我很多时间! (2认同)