是否有禁止粘贴到 UITextField 的首选技术?

Is there a preferred technique to prohibit pasting into a UITextField?

我已经阅读了针对 Swift 的不同版本提供的几种解决方案。

我看不到的是如何实现扩展——如果这是实现它的最佳方式的话。

我确定这里有一个明显的方法,预计会首先为人所知,但我没有看到。我添加了此扩展程序,我的 none 个文本字段受到影响。

extension UITextField {

    open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(UIResponderStandardEditActions.cut) || action == #selector(UIResponderStandardEditActions.copy)
    }
}

您不能使用扩展覆盖 class 方法。
来自 docs“注意扩展可以向类型添加新功能,但它们不能覆盖现有功能。”

您需要的是子class UITextField 并在那里覆盖您的方法:

仅禁用粘贴功能:

class TextField: UITextField {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(UIResponderStandardEditActions.paste) {
            return false
        }
        return super.canPerformAction(action, withSender: sender)
    }
}

用法:

let textField = TextField(frame: CGRect(x: 50, y: 120, width: 200, height: 50))
textField.borderStyle = .roundedRect
view.addSubview(textField)

只允许复制和剪切:

class TextField: UITextField {
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        [#selector(UIResponderStandardEditActions.cut),
         #selector(UIResponderStandardEditActions.copy)].contains(action)
    }
}

班次 5

 // class TextField: UITextField
extension UITextField {

    open override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(UIResponderStandardEditActions.cut) || action == #selector(UIResponderStandardEditActions.copy)
    }
}