在我的 iOS 应用程序中,我有一个用户填写的表单。我正在使用 UIKeyboard
上的返回键移动到屏幕上的下一个 UITextField
。
所以我像这样实现了 textFieldShouldReturn
:
-(BOOL)textFieldShouldReturnBBTextField *)textField
{
//The textFields are in a UITableView with custom cells///
NSIndexPath *indexPath = [self.tableView indexPathForCellContaininView:textField];
if (self.selectedSegmentIndex == SegmentedControlStep1){
if (indexPath.section == 0){
switch (indexPath.row){
case 0:
[self.textFieldne becomeFirstResponder];
break;
case 1:
[self.textFieldTwo becomeFirstResponder];
break;
}
}
if (indexPath.section == 1){
switch (indexPath.row){
case 0:
[self.textFieldThree becomeFirstResponder];
break;
case 1:
[self.textFieldFour becomeFirstResponder];
break;
case 2:
[self.textFieldFive becomeFirstResponder];
break;
}
}
if (indexPath.section == 2){
switch (indexPath.row){
case 0:
[self.textFieldSix becomeFirstResponder];
break;
case 1:
[self.textFieldSeven becomeFirstResponder];
break;
case 2:
[self nextButtonPressed:nil];
break;
}
}
}
if (self.selectedSegmentIndex == SegmentedControlStep2){
switch (indexPath.row){
case 0:
[self.textFieldNine becomeFirstResponder];
break;
}
}
return YES;
}
此代码有效。但是,当调用 textFieldDidEndEditing
时,我会验证某些文本字段的输入,如果验证失败,则会在屏幕上显示 UIAlert。
我是这样处理的:
-(void)alertViewUIAlertView *)alertView clickedButtonAtIndexNSInteger)buttonIndex
{
/* Cancel registration */
if (buttonIndex == 1){
[self dismissViewControllerAnimated:YES completion:nil];
}
/* Okay button */
if (buttonIndex == 0){
if (self.viewModel.telephoneNumberFailedValidation){
[self.textFieldOne becomeFirstResponder];
}else if (self.viewModel.mobileNumberFailedValidation){
[self.textFieldTwo becomeFirstResponder];
}
}
}
所以到目前为止,一切似乎都可以正常工作。一旦 UIAlertView
被解除,就会发生以下情况:
textFieldDidEndEditing
被调用(预期并且文本参数为 nil ) - 很好。
textFieldDidBeginEditing
被调用 - (预期我们现在又回到了第一个响应者的 textField 上)
textFieldDidEndEditing
在刚刚成为第一响应者的文本字段上再次调用。由于旧的失败文本仍在该字段中,验证失败,我们进入一个恒定循环。
为什么 textFieldDidEndEditing
会被调用两次?
编辑:
UIAlertView
被解除后来自引用的堆栈跟踪:
由于我无法弄清楚为什么 textFieldDidEndEditing
被调用了两次,我决定查看其他可能更合适的 UITextField 委托(delegate)
方法并找到了这个 gem:textFieldShouldEndEditing
- 它询问 textField
应该 是否结束编辑。似乎是我的验证逻辑进入的完美位置。如果验证失败,我只需返回 NO
并且焦点仍然在 UITextField
因此,不需要 UIAlertView 的
delegate
方法:clickedButtonAtIndex
- 更少的代码!
这个 workaround
似乎是解决我的问题的正确方法。
关于ios - UITextField 的奇怪行为和辞职的第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560161/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |