XCode:保持按钮禁用,直到填写所有可用的文本字段

时间:2014-08-24 08:54:33

标签: objective-c button if-statement

我想保持一个按钮禁用,直到我用数字填充三个文本字段。 在三个文本字段中输入值后,将启用该按钮。

我做了以下事情:

-(BOOL)textField:(UITextField *)theTextField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
 NSString *Width = [theTextField.text stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%@",self.Width]];
 NSString *Height = [theTextField.text stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%@",self.Height]];
NSString *Length = [theTextField.text stringByReplacingCharactersInRange:range withString:[NSString stringWithFormat:@"%@",self.Length]];

if (([Width length] > 0) && ([Height length] > 0) && ([Length length] > 0)) self.saveBarButton.enabled = YES;
else self.saveBarButton.enabled = NO;
return YES;
}

当我运行应用程序时,即使我在第一个文本字段中放入一个数字,该按钮也会启用。 为什么会发生这种情况,因为我已经设置了3个条件来启用它,如上所示。

请问任何建议?

1 个答案:

答案 0 :(得分:1)

两件事 -

<强>一

因为在所有这三种情况下都是

[NSString stringWithFormat:@"%@",self.Height]

解析为null参数。

"(null)"

因此当值为nil时,长度为6

<强>两个

您的测试同时依赖于3条信息,这些信息是相关文本字段的内容。 委托方法一次只提供一件。

一种方法是将文本字段连接到IBOutlets,并在更改发生后读取它们的值。

@property (weak,nonatomic) IBOutlet UITextField *widthTextField;
@property (weak,nonatomic) IBOutlet UITextField *lengthTextField;
@property (weak,nonatomic) IBOutlet UITextField *heightTextField;

...

-(void)textFieldDidBeginEditing:(UITextField *)textField {

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:textField];

}

-(void)textFieldDidEndEditing:(UITextField *)textField {

     [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:textField];


}


-(void)textDidChange:(NSNotification *)note {

    self.saveBarButton.enabled = self.widthTextField.length > 0 &&
                                 self.lengthTextField.length > 0 &&
                                 self.heightTextField.length > 0;

}

一个无关紧要的风格点;按照惯例,Objective-C变量是低级的,以防止与类名混淆。