我有一个包含许多字段的详细视图,其中一些使用textFieldShouldEndEdit进行一些验证。这一切都很有效。但是,如果用户在字段中输入无效数据,然后按取消按钮,则验证例程仍会在调用 textFieldShouldEndEdit 时运行。有没有办法防止这种情况?换句话说,只需干净取消,因为我不在乎该字段包含什么。
取消按钮功能内清除当前的文本字段.text=@";
检查文本字段应该结束最初编辑
if ([textfield.text isEqualtoEmpty:@""]
{
return Yes;
}
else{
// check your condition here
}
Senthikumar 的答案在那种特殊情况下有效,但我有一个类似的情况,我需要检查该字段是否也不为空......
因此,我使用了以下技术:
- 我创建了一个名为"cancelButtonPressed"的 BOOL 属性
- 在链接到取消按钮的方法中,我将此布尔值设置为 YES
- 在textViewShouldEndEdit中,我首先检查这个BOOL。如果为否,则执行我的控件(例如,包括警报视图)。此方法应始终通过调用返回 YES; 来完成,这意味着如果这个"cancelButtonPressed"布尔值是 YES,它应该结束文本字段编辑(例如,不要在我的脸上发出警报)。
此外(这与问题没有直接联系,但通常带有"取消"功能),您可能还有一个"保存"按钮,在这种情况下,如果您正在编辑 textField 并且输入不正确,您希望阻止用户保存。
在这种情况下,我创建了另一个名为"textFieldInError"的 BOOL,如果我的控件在textViewShouldEndEditing 失败,如果我的控件成功(在方法结束时),则为 NO。然后,在链接到我的保存按钮的方法中,我检查此 BOOL 是否为否。
这是完整的代码:
@property (nonatomic) BOOL cancelButtonPressed;
@property (nonatomic) BOOL textFieldInError;
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
// If the user pressed Cancel, then return without checking the content of the textfield
if (!self.cancelButtonPressed) {
// Do your controls here
if (check fails) {
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Incorrect entry"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
// Prevent from saving
self.textFieldInError = YES;
return NO;
}
}
// Allow saving
self.textFieldInError = NO;
return YES;
}
保存和取消方法:
- (void)saveButtonPressed;
{
// Resign first responder, which removes the decimal keypad
[self.view endEditing:YES];
// The current edited textField must not be in error
if (!self.textFieldInError) {
// Do what you have to do when saving
}
}
- (void)cancel;
{
self.cancelButtonPressed = YES;
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}
我希望这可以帮助其他人,因为我非常头疼地以一种干净、直接的方式解决这个问题。
佛瑞德