Edu*_*ard 9 objective-c ios swift
我现在正试着将这个转换成Swift而没有太多的背景.
这是我到目前为止所得到的...而且我一直在寻找谷歌并不知道要搜索什么才能更具体.你能否详细说明我做错了什么?谢谢
更新:
我已经找到了objective-c标签,因此更多与此线程相关的人可能能够看到它并希望得到答案.
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;)
这是一个稍微更安全(没有不安全的展开)的版本,可与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)
对于仍在寻找的人,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
| 归档时间: |
|
| 查看次数: |
2666 次 |
| 最近记录: |