我有一个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
}
这很有效,但是现在我可以长按并粘贴到文本字段中,因此它处于活动状态,它不会以这种方式显示键盘。
所以我试过的任何方式都不方便。你有什么建议来实现这个目标?
答案 0 :(得分:1)
因此,要创建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委托和数据源方法;如果你不知道的话,我假设你可以弄清楚如何做到这一点。
答案 1 :(得分:0)
您可以使用UIPickerView来实现您的功能。如果选择器必须是AlertView,您可以用UILabel替换UITextField并在其上放置UIButton,然后您可以在UIButton回调中实现自定义操作并在UILabel中显示选择。
答案 2 :(得分:0)
您可以在UIButton
上UITextField
,并将其前导,尾随,顶部和底部与UITextField
对齐。
然后为按钮添加操作。
禁用TextField。
答案 3 :(得分:0)
创建一个自定义的UIViewController,其背景颜色是清晰的,并添加UIPickerView以显示选项。当UITextField成为焦点时,显示UIViewController(覆盖在当前UIView之上)。因此,您可以在自定义UIViewController中执行句柄。