iOS13、禁用剪贴板功能

iOS 13, disable clipboard features

我试图在我的应用程序的文本字段中禁用剪切、粘贴、复制等操作。通过阅读堆栈溢出,似乎有两种方法可以通过 subclassing UITextField 和使用自定义 class 作为您的文本字段或通过扩展 UITextField 来做到这一点。因为我想为所有文本字段禁用此功能,所以我选择了后者,因为它更简单。

import Foundation

extension UITextField {
    override open func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
            return false
       }
}

无论如何,这两种方法在我的测试 iOS 12 iPad 中似乎都可以正常工作,但在我的测试 iOS 13 iPhone 8 中根本不起作用。 .. 当我在 iOS 13 中长按时,会出现相同的选项来剪切过去等,同时行为与 iOS 12 中的预期一样,用户无法访问任何这些菜单项。我该怎么做才能将此功能扩展到 iOS 13?

你实际上接近你的解决方案。 由于 UITextField 仍然是 Objective-C Class 阅读 class 很容易理解。

Objective-C 中的选择器是这样写的..

@selector(methodname:) 

对应于Swift

#selector(methodName(_:))

其中 selector 指的是 SEL 数据类型,按名称指向 class 方法,而 : 表示您显式指向采用对象或范围。因为你可以有一个同名的方法,但不带任何对象或参数,objective-c 这不是一个压倒一切的规则,而是一个完全不同的方法。

#selector(methodName()) // not same method as above

那么为什么您的解决方案不起作用?
您的 select 或指向一般遵循 UIResponderStandardEditActions 协议的方法。但是你想要你的 subclass(或扩展)中的 superclass 实现的方法的 selectors。

结论:
这可能是您想要的..

class SecureUITextField : UITextField {

    override func canPerformAction(_ action:Selector, withSender sender:Any? ) -> Bool {
        if  action == #selector(paste(_:)) ||
            action == #selector(cut(_:)) ||
            action == #selector(copy(_:)) ||
            action == #selector(select(_:)) ||
            action == #selector(selectAll(_:)) {
             return false
        }
        return super.canPerformAction(action, withSender: sender)
    }
}

从这里到哪里去?
您可以实现继承协议 <UIResponderStandardEditActions> paste(:)、copy(:) 等您自己的重写功能,让它们什么都不做。但是你不需要,只要使用你的 class 的编码器将遵循协议而不是使他们自己的总体目标操作仍然可以粘贴,select 和复制。