我想检查我当前的UITextField,并在编辑完成时跳转到下一个。
到目前为止,我已实现此代码,但由于某些原因无效。
重要事项:实际按预期工作的代码是Robert方法,请参见下文。因为我的声誉很低,所以我无法为他投票。
NEW ADDED:我使用此限制为一个字符
//Limit the length of the UITextfields
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
guard let text = textField.text else { return true }
let newLength = text.characters.count + string.characters.count - range.length
print("textField...shouldChangeCharactersInRange method called")
switch textField {
case rateTvA:
return newLength <= limitLength
case rateTvB:
return newLength <= limitLength
case rateTvC:
return newLength <= limitLength
// Do not put constraints on any other text field in this view
// that uses this class as its delegate.
default:
return true
}
}
注意:我希望每个UITextField只收到一个字符
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
let charCount = textField.text!.characters.count
print("textFieldShouldEndEditing method called")
print("How many characters has been typed in? \(charCount)")
switch textField {
case rateTvA:
if(charCount > 0) {
rateTvB.becomeFirstResponder()
return true
}
case rateTvB:
if(charCount > 0) {
rateTvC.becomeFirstResponder()
return true
}
case rateTvC:
if(charCount > 0) {
rateTVD.becomeFirstResponder()
return true
}
default:
return false
}
return false
}
答案 0 :(得分:2)
您需要什么取决于您希望用户获得的体验。
1)您希望在用户输入单个字符后自动跳转到下一个文本字段。在这种情况下,您应该使用Interface Builder连接文本字段&#34;编辑已更改&#34;事件到控制器中的IBAction方法。 IBAction方法应该执行第一响应者切换逻辑。
2)您希望用户采取某些操作来指示编辑已完成。然后,该动作的处理程序应该执行第一响应者切换逻辑。我认为返回键是一个很好的方法。在这种情况下,您将使用TextField委托的textFieldShouldReturn方法。
此外,如果用户通过单击文本字段B或C之一(或您正在呈现的其他UI元素)结束文本字段A的编辑,您应该考虑要发生的事情;在这种情况下,将调用您的文本字段委托的textFieldXXXXEndEditing方法。问题是:textFieldXXXXEndEditing方法是否应该将焦点从用户选择的元素上移开?
最后,您说您的代码无效。什么不起作用?是不是在调用textFieldShouldEndEditing方法?如果不是,那么您可能没有分配到文本字段的委托属性。或者,您可能会对调用textFieldShouldEndEditing方法的原因感到困惑(我上面的建议应该为您提供一些线索)。
这是一些代码。插座应使用IB连接。另外,使用IB将三个文本字段中每个文本字段的Editing Changed事件连接到IBAction方法。
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var textFieldA: UITextField!
@IBOutlet weak var textFieldB: UITextField!
@IBOutlet weak var textFieldC: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textFieldA.delegate = self
textFieldB.delegate = self
textFieldC.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
print("Should begin editing")
return true;
}
func textFieldDidBeginEditing(textField: UITextField) {
print("Did begin editing")
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
print("Should end editing")
return true;
}
func textFieldDidEndEditing(textField: UITextField) {
print("Did end editing")
}
func textFieldShouldClear(textField: UITextField) -> Bool {
print("Should clear")
return true;
}
func textFieldShouldChangeCharactersInRange(textField: UITextField, range: NSRange, replacement: String) -> Bool {
print("Should change")
return true;
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
print("User pressed return: switching to next text field")
switchFields(textField)
return true;
}
@IBAction func textChanged(textField: UITextField) {
print("User entered a character; switching to next text field")
switchFields(textField)
}
private func switchFields(textField: UITextField) {
switch textField {
case textFieldA:
textFieldB.becomeFirstResponder()
case textFieldB:
textFieldC.becomeFirstResponder()
case textFieldC:
textFieldA.becomeFirstResponder()
default:
break
}
}
}
答案 1 :(得分:1)
您应该更改“textFieldDidEndEditing”委托调用中的响应者。因此,请在“textFieldShouldEndEditing”中取出xxx.becomeFirstResponder()调用并大致实现:
{{1}}
我没有编译这个,所以要小心。
答案 2 :(得分:0)
在Objective c中你可以这样做:
-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (_verifyOTP.text.length >= 1 && range.length == 0)
{
[self.verifyOTP2 becomeFirstResponder];
}
if(_verifyOTP2.text.length >= 1 && range.length == 0) {
[_verifyOTP2 resignFirstResponder];
[self.verifyOTP3 becomeFirstResponder];
}
if (_verifyOTP3.text.length >= 1 && range.length == 0)
{
[_verifyOTP3 resignFirstResponder];
[self.verifyOTP4 becomeFirstResponder];
}
if (_verifyOTP4.text.length >= 1 && range.length == 0)
{
[self.verifyOTP4 becomeFirstResponder];
}
return YES;
}
使用textfield delegate