当textfields为空时禁用按钮

时间:2011-08-15 14:55:40

标签: objective-c nsstring uitextfield uitextfielddelegate

嗨,我是一名编程初学者,多年来一直坚持这项任务,似乎无处可去。

基本上我有几个文本字段,当用户按下按钮时,它会在不同的页面上生成输入信息。我希望在所有文本字段都填充信息之前禁用该按钮。

到目前为止,我有这个:

    - (void)textFieldDidEndEditing:(UITextField *)textField
{
    // make sure all fields are have something in them

if ((textfbookauthor.text.length  > 0)&& (textfbookedition.text.length > 0)&& (textfbookplace.text.length > 0)&& (textfbookpublisher.text.length > 0) && (textfbookpublisher.text.length > 0) && (textfbooktitle.text.length > 0)  && (textfbookyear.text.length > 0)) {
        self.submitButton.enabled = YES;
    }
    else {
        self.submitButton.enabled = NO;
    }
}

问题是'submitButton'出现错误,需要取代它的位置? 我试着将按钮'bookbutton'放在其中,但它不起作用。

这是我的'生成'按钮的功能

    -(IBAction)bookbutton:(id)sender;
{
    NSString* combinedString = [NSString stringWithFormat:
                                @"%@ %@ %@.%@.%@:%@.", 
                                textfbookauthor.text,
                                textfbookyear.text,
                                textfbooktitle.text,
                                textfbookedition.text,
                                textfbookplace.text,
                                textfbookpublisher.text];
    BookGenerate*bookg = [[BookGenerate alloc] init];
    bookg.message = combinedString;
    bookg.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self presentModalViewController:bookg animated:YES];
    [BookGenerate release];
}

如果有人知道我如何使它工作或我需要添加什么,请帮助。

提前致谢

5 个答案:

答案 0 :(得分:25)

为每个UITextField创建一个Outlet并在.h中创建一个IBAction:

IBOutlet UITextField *textField1;
IBOutlet UITextField *textField2;
IBOutlet UITextField *textField3;
IBOutlet UIButton *button

- (IBAction)editingChanged;

连接所有插座并使用editingChanged:

将IBAction连接到每个文本字段
 - (IBAction)editingChanged {
    if ([textfield1.text length] != 0 && [textfield2.text length] != 0 && [textfield3.text length] != 0) {
         [button setEnabled:YES];
     }
     else {
         [button setEnabled:NO];
     }
 }

请注意,您也可以使用[textfield.text isEqualToString:@""]并在其前面添加!!表示'不')以识别空textField,并说'如果textField是空的......'

- (void)viewDidLoad {
    [super viewDidLoad];
    [button setEnabled:NO];
}

答案 1 :(得分:6)

如果您有一个按钮,并且只有在textfield或textview中有文本时才启用它,请执行以下方法

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{    
    if (textView.text.length > 1 || (text.length > 0 && ![text isEqualToString:@""]))
    {
        self.button.enabled = YES;
    }
    else
    {
        self.button.enabled = NO;
    }

    return YES;
}

答案 2 :(得分:2)

这些帖子上也有很少的解决方案

这里的关键是使用(扩展)UITextFieldDelegate类及其相关函数

//Need to have the ViewController extend UITextFieldDelegate for using this feature
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    // Find out what the text field will be after adding the current edit
    let text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)

    if !text.isEmpty{//Checking if the input field is not empty
        button.userInteractionEnabled = true //Enabling the button
    } else {
        button.userInteractionEnabled = false //Disabling the button
    }

    // Return true so the text field will be changed
    return true
}

答案 3 :(得分:1)

您应该使用“textfield应该更改范围内的chracters”(请参阅​​ucextviewdelegate的apple docs)。因为它会在用户输入信息时更新。“Textfield确实结束编辑”仅在用户完成编辑文本字段或点击输入时触发。在大多数情况下,有人会填写最后一个字段并将光标留在那里并期望按钮变为启用...但是,仅仅因为输入了“textfield did end editing”就不会发生这种情况。

你也可以这样做来检查长度

if([self.textfiele.text isEqualToString:@""])

答案 4 :(得分:1)

除了为每个UITextField提供IBOutlets之外,声明包含数组中所有3个文本字段的IBOutletCollection可能会有所帮助。

@property (nonatomic, retain) IBOutletCollection(UITextField) NSArray *textFields;

然后在您的实施中@synthesize textFields,您可以快速循环它包含的文本字段,检查文本。

- (IBAction)editingChanged
{
    BOOL buttonShouldBeEnabled = YES;

    for (UITextField *field in self.textFields)
        if (!field.text.length)
            buttonShouldBeEnabled = NO;

    button.enabled = buttonShouldBeEnabled;
}