【发布时间】:2012-03-23 11:42:11
【问题描述】:
这个让我有点发疯,我的眼睛在掩饰。
我有一个带有导航控制器的应用。
视图 A 有一些输入字段和一个加载视图 B 的“继续”按钮
当我点击导航控制器左上角的“返回”按钮时,它会导致事件以我不期望/不理解的顺序触发
我的追踪揭示了......
View B: viewWillDisappear
View A: viewWillAppear
View B: textFieldShouldEndEditing
编辑 -- 更多细节/代码解释我之前含糊的问题
从概念上讲,以下方法运行良好,并通过了几轮 QA 测试。
总之,我使用textFieldShouldEndEditing 来验证文本字段。如果它们无效,我会继续关注该领域并向他们显示错误信息。一切都很好,并且当用户尝试从一个字段转到另一个字段时,验证工作。
以下代码存在问题的情况是,如果有人输入了部分值,然后单击了“返回”。整个应用程序中的所有UITextFields 冻结(不允许输入),在某些情况下应用程序崩溃。
我尝试发布初始问题的方法是创建一个私有的:BOOL isDisappearing;
我可以签入viewWillDisappear(在大多数情况下会在 textFieldShouldEndEditing 之前触发),如果是,我会将触发和冻结 UITextFields/app 的有问题的代码短路。
这在多个视图中都可以正常工作,但在 1 种情况下,“VIEW A:viewWillAppear”事件在下面的 textFieldShouldEndEditing(视图 B)之前触发 - isDisappearing 以某种方式设置为“NO”并且有问题的代码正在触发在textFieldShouldEndEditing
我希望这会有所帮助,您可以关注。我发现没有代码很难解释——但我试图将其精简为相关的内容。我希望这在这里是合适的——我对社区很陌生。
视图 B 的代码:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string
{
// Enforce max lengths
// The return key from the keyboard counts as a character, so we have to exempt it
if (textField.tag == ROUTING_NUMBER_TAG)
{
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 9 && ![string isEqualToString:@"\n"]) ? NO : YES;
}
else if (textField.tag == ACCOUNT_NUMBER_TAG)
{
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return (newLength > 17 && ![string isEqualToString:@"\n"]) ? NO : YES;
}
return YES;
}
// textField validation
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
if (isDisappearing)
return YES;
//run fields through validators and display validation messages.
//IF THEY DON’T PASS VALIDATION IM "HOLDING THEM HOSTAGE" BY KEEPING THE FOCUS ON THE UITEXTFIELD (returning NO)
if (textField.tag == ROUTING_NUMBER_TAG )
{
if ([Utility isValidRoutingNumber:textField.text]== NO)
{
[[iToast makeText:NSLocalizedString(@"Enter valid routing number", @"")] show];
return NO;
}
else
{ //save it
extension.payment.routingNumber = routingNumber.text;
}
}
else if (textField.tag == ACCOUNT_NUMBER_TAG)
{
if ([Utility isValidAccountNumber:textField.text] == NO)
{
[[iToast makeText:NSLocalizedString(@"Enter valid account number", @"")] show];
return NO;
}
else
{ //save it
extension.payment.accountNumber = accountNumber.text;
}
}
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
//I do nothing here except nulling out the 'activefield' var I use to autoscroll the uiscrollview as the user taps around from field to field
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//reset the bool so that when they come back we're back to the 'normal' state and validation will again be checked in textFieldShouldEndEditing
isDisappearing = NO;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
-(void)viewWillDisappear:(BOOL)animated
{
TRC_ENTRY
//set the bool to bypass validations in textFieldShouldEndEditing
isDisappearing = YES;
[super viewWillDisappear:animated];
}
【问题讨论】:
标签: iphone objective-c ios xcode