繁体   English   中英

禁止编辑UITextField但检测点击

[英]Prevent UITextField editing but detect taps

我有一个UITextField,我试图检测它的水龙头,并防止用户同时键入输入。 场景是,我将使用警报视图来使用户选择一个选项并将其写入UITextField中,而不是用户使用键盘键入它。

我尝试在viewDidLoad()

myTextField.delegate = self
myTextField.isEnabled = true
myTextField.isUserInteractionEnabled = false

// for keyboard
myTextField.inputView = UIView()

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didRecognizeTapGesture(_:)))
myTextField.addGestureRecognizer(tapGesture)

但是,此轻击手势不起作用:

private dynamic func didRecognizeTapGesture(_ gesture: UITapGestureRecognizer) {
    print("YYYY")
    let point = gesture.location(in: gesture.view)
    guard gesture.state == .ended, taxableField.frame.contains(point) else { return }
    //doSomething()
}

然后我尝试将userInteractionEnabled设置为true,这一次:

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    if textField == myTextField {
        print("XXXX")
        return true
    }
    return true
}

这行得通,但是现在我可以长按并粘贴到文本字段中,因此它处于活动状态,只是没有以这种方式显示键盘。


因此,我尝试过的任何方法似乎都不方便。 您对实现这种目标有何建议?

因此,要创建UIPickerView并将其添加为inputView,需要一个委托和一个数据源。 对于此示例,我将假定您的VC将担任所有这些角色。 我通常将它们分成自定义类,但我想保持简单:

// Data source for your picker view
var pickerViewData : [String]?
var myPickerView = UIPickerView()
@IBOutlet myTextField : UITextField!
func viewDidload() {
    myPickerView.delegate = self
    myPickerView.dataSource = self
    myTextField.delegate = self
    myTextField.inputView = pickerView
}

然后,要更新UITextField,无论何时使用选择器视图,都应实现正确的委托方法(除非您实现该方法,否则它将不会生成):

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    myTextField.text = pickerViewData![pickerView.selectedRow(inComponent: 0)]
}

就是这样! 您还必须实现其他一些UIPickerView和UITextField委托和数据源方法。 我假设您不知道该怎么做。

您可以将UIButton放在UITextField并将其前导,尾随,顶部和底部与UITextField对齐。

然后为按钮添加一个动作。

禁用TextField。

您可以使用UIPickerView来实现您的功能。 如果选择器必须是AlertView,则可以将UITextField替换为UILabel并在其上放置UIButton,然后可以在UIButton回调中实现自定义操作,并在UILabel中显示选择。

创建一个自定义的UIViewController,背景颜色清晰,并添加一个UIPickerView来显示选项。 当UITextField成为焦点时,显示UIViewController(在当前UIView上方叠加)。 因此,您可以在自定义UIViewController中进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM