使 UiTextField 只接受粘贴选项 - Swift

Posted

技术标签:

【中文标题】使 UiTextField 只接受粘贴选项 - Swift【英文标题】:Make UiTextField accept only paste option - Swift 【发布时间】:2021-02-26 18:03:57 【问题描述】:

我想让 UiTextField 在长按时只接受粘贴选项,并且不像 ios 手机应用程序中那样显示键盘或光标。

我尝试使用委托方法移除键盘,但现在确实出现了粘贴选项。

你能帮帮我吗?

@IBOutlet weak var phoneNumberTf:UITextField? 
didSet 
    phoneNumberTf?.backgroundColor = .clear
    phoneNumberTf?.textAlignment = .left
    phoneNumberTf?.font = UIFont().font_regular(ofSize: 38)
    phoneNumberTf?.delegate = self
    

extension KeypadView: UITextFieldDelegate 
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool 
        return false
    

【问题讨论】:

也许只用一个按钮代替...read这个值,然后把按钮的标题改成字符串 【参考方案1】:

您可以通过使用长按手势识别器创建 UILabel 的子类并设置 UIMenuController 来实现此目的。

class MenuLabel: UILabel 

    override var canBecomeFirstResponder: Bool 
        return true
    

    // MARK: - Init

    override init(frame: CGRect) 
        super.init(frame: frame)
        commonInit()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonInit()
    

    private func commonInit() 
        isUserInteractionEnabled = true
        addGestureRecognizer(
            UILongPressGestureRecognizer(
                target: self,
                action: #selector(handleLongPressed(_:))
            )
        )
    

    // MARK: - Actions

    @objc internal func handleLongPressed(_ gesture: UILongPressGestureRecognizer) 
        guard let gestureView = gesture.view, let superView = gestureView.superview else 
            return
        

        let menuController = UIMenuController.shared

        guard !menuController.isMenuVisible, gestureView.canBecomeFirstResponder else 
            return
        

        gestureView.becomeFirstResponder()

        menuController.menuItems = [
            UIMenuItem(
                title: "Paste",
                action: #selector(handlePasteAction(_:))
            ),
        ]

        menuController.showMenu(from: superView, rect: gestureView.frame)
    

    @objc internal func handlePasteAction(_ controller: UIMenuController) 
        self.text = UIPasteboard.general.string
    

长按后,UIMenuController 将显示一个粘贴选项,然后将 UILabel 的文本值设置为UIPasteboard.general.string

【讨论】:

以上是关于使 UiTextField 只接受粘贴选项 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

在 UITextField 中禁用“定义”

如何限制 UITextField 在 Swift 中只接受数字?

在 UILabel 上显示 iPhone 剪切复制粘贴菜单

如何使键盘 UITextField 中的数字视图成为默认值?

UITextField如何禁用粘贴? [复制]

UITextField 更改事件不会针对语音或粘贴输入触发