我有一个 UIViewController
其中有3个三 UITextField
s - TF1、TF2和TF3。当应用程序在iOS模拟器上运行时,我按Tab键,焦点会像预期的那样移动到下一个文本字段。
TF3是特殊的,当用户点击TF3时,焦点应该移动到下一个文本字段。当用户点击TF3时,文本字段不应该被聚焦,而是必须在屏幕上显示一个新的视图。我已经实现了 UITextFieldDelegate
办法 textFieldShouldBeginEditing(_:)
解决这个问题的方法如下
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == TF3) {
// show new view
return false
}
return true
}
这样就能达到预期的效果。
添加上述代码后,每当按下Tab键,就会显示新的视图。这是因为每当按下Tab键时。textFieldShouldBeginEditing(_:)
在屏幕上的所有文本字段上被调用。
考虑到TF1是目前的第一个响应者,如果我按Tab键,它就会像预期的那样把焦点移到TF2上。
如果我按Tab键,它就会按照预期将焦点移动到TF2。然而,新的视图也显示出来了,因为 textFieldShouldBeginEditing(_:)
是在TF3上调用的。
谁能指出如何解决这个问题?
如果我理解正确的话,你想要的是下面的内容。
A计划
var isTF3Beginned = false // a property of current view controller as flag
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == TF3 && isTF3Beginned == true) {
// show new view
return false
}
isTF3Beginned = true
return true
}
B计划RxSwift
TF3.rx
.controlEvent(.editingDidBegin)
.skip(1)
.subscribe(onNext: { () in
// show new view
}).disposed(by: disposeBag)