使 UiTextField 只接受粘贴选项 - Swift

问题描述

我想让一个 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
    }
}

解决方法

您可以通过使用长按手势识别器创建 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