gpt4 book ai didi

ios - UITextField 的奇怪行为和辞职的第一响应者

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:00 24 4
gpt4 key购买 nike

在我的 iOS 应用程序中,我有一个表单供用户填写。我正在使用 UIKeyboard 上的返回键移动到屏幕上的下一个 UITextField

所以我这样实现了textFieldShouldReturn:

-(BOOL)textFieldShouldReturn:(BBTextField *)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)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)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 被取消,就会发生以下情况:

  1. textFieldDidEndEditing 被调用(预期且文本参数为 nil )- 很好。

  2. textFieldDidBeginEditing 被调用 -(预期我们又回到了现在再次成为第一响应者的 textField)

  3. textFieldDidEndEditing 在刚刚成为第一响应者的文本字段上再次调用。由于旧的失败文本仍在该字段中,因此验证失败并且我们进入了一个持续循环。

为什么 textFieldDidEndEditing 被调用了两次?

编辑:

UIAlertView 被关闭后来自引用的堆栈跟踪:

enter image description here

最佳答案

因为我无法弄清楚为什么 textFieldDidEndEditing 被调用两次,所以我决定查看其他可能更合适的 UITextField delegate 方法并找到了这个 gem:textFieldShouldEndEditing - 它询问 textField 应该 结束编辑。似乎是我的验证逻辑进入的完美位置。如果验证失败,我只是返回 NO,并且焦点仍然在 UITextField 上,因此,不需要 UIAlertView 的 delegate 方法:clickedButtonAtIndex - 代码更少!

解决方法 似乎是解决我的问题的正确方法。

关于ios - UITextField 的奇怪行为和辞职的第一响应者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31560161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com