如何在 ios 13 中禁用 pdfkit pdfview 中的查找、共享、转发菜单项
Posted
技术标签:
【中文标题】如何在 ios 13 中禁用 pdfkit pdfview 中的查找、共享、转发菜单项【英文标题】:How to disable look up, share, forward menu items in pdfkits pdfview in ios13 【发布时间】:2019-11-05 13:05:11 【问题描述】:自从 ios13 更新后,覆盖 PDFView
类的方法
canPerformAction(_ action: Selector, withSender sender: Any?)
不再检测或控制“查找”、“共享”和“转发”菜单项,我无法找到禁用它们的方法。
以前以这种方式覆盖它会阻止所有菜单项:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
但是这只会阻止从 ios13 剪切、复制、粘贴。 有没有人弄清楚这一点?如果是这样,我将非常感谢您的帮助!
【问题讨论】:
为什么这被否决了?! 你找到解决办法了吗? 还没有。希望苹果能在未来的版本中解决这个问题 【参考方案1】:我遇到了同样的问题。看起来在 iOS13 中,一些操作(菜单和触摸)被委托给 PDFView
的属性 documentView
。因此,该视图类的方法调配对我有用,但它看起来像一个有效但“肮脏”的黑客。
在我的PDFView
子类中我添加了:
private func swizzleDocumentView()
guard let d = documentView, let documentViewClass = object_getClass(d) else return
let sel = #selector(swizzled_canPerformAction(_:withSender:))
let meth = class_getInstanceMethod(object_getClass(self), sel)!
let imp = method_getImplementation(meth)
let selOriginal = #selector(canPerformAction(_:withSender:))
let methOriginal = class_getInstanceMethod(documentViewClass, selOriginal)!
method_setImplementation(methOriginal, imp)
@objc func swizzled_canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool
return false
【讨论】:
感谢您的回答。我试过从 init 调用你的方法(使用 Swift 3),但它从来没有得到 documentView.. 你从哪里调用你的方法? 在阅读之后,我已经为 documentView 实现了你的方法,但是“查找”、“共享”菜单项仍在显示。所以,不幸的是,它不起作用。 (ios 13.4.1 模拟器,Swift 3.1) 哦,我忘了说,PDFView
实例的document
属性填充后documentView
属性不是nil
。所以我在PDFView
子类和didSet
闭包调用swizzleDocumentView()
中覆盖了document
属性。您还需要一个标志来防止多次混合。 p.s.抱歉延迟回答
不幸的是它仍然不起作用。也许还需要别的东西?
这个解决方案对我很有效。看起来查找和共享是由文档视图处理的。当然这不是最好的解决方案,但我想我们需要遵循这种方式,直到苹果允许我们在 PDFView 子类中很好地处理这个问题。【参考方案2】:
找出您选择的元素属于哪个类(UITextField、UITextView、UIWebView 等),然后将其canPerformAction:withSender:
方法调配。
【讨论】:
感谢您花时间写一个答案。问题中提到了方法和类。上面的 canPerformAction() 覆盖在 ios 11 和 12 中适用于 pdfview,并且在 ios 13 中已停止正常工作以上是关于如何在 ios 13 中禁用 pdfkit pdfview 中的查找、共享、转发菜单项的主要内容,如果未能解决你的问题,请参考以下文章