如果所有文本字段都填写在 ios 中,则启用按钮

Posted

技术标签:

【中文标题】如果所有文本字段都填写在 ios 中,则启用按钮【英文标题】:To enable button if all the textfields are filled in ios 【发布时间】:2014-08-09 06:05:55 【问题描述】:

我在 ios 中设计了一个注册表单,其中包含四个 UITextFields 和一个 UIButton。默认情况下,我已将按钮的 enabled 属性设置为 NO。现在我只想在所有四个文本字段都填满时启用该按钮。你能帮我解决这个问题,因为我是 ios 的新手,并且遇到了这个问题。

【问题讨论】:

更好的方法是检查按钮单击是否所有四个文本字段都已填充。如果是,则允许您采取行动,如果不是,则针对特定文本字段发出警报。 如果您需要,可以为此提供代码。 【参考方案1】:

更好的方法是使用didChange 方法,如UITextViewDelegate 方法,但我们知道UITextFieldDelegate 没有didChange 方法。您可以手动添加行为。您可以使用 shouldChangeCharactersInRange: 方法,但我个人建议不要覆盖方法,除非您绝对必须这样做。

您可以使用以下方式添加行为:

[myTextField1 addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];//And so on for all your text fields

并且在目标方法中:

- (void)textFieldDidChange:(UITextField*)textField

    if (myTextField1.text.length > 0 && myTextField2.text.length > 0 && myTextField3.text.length > 0 && myTextField4.text.length > 0)

        myButton.enabled = YES;

     else 

        myButton.enabled = NO;
    

编辑: 此外,如果您想确保它们仅在用户输入有效文本而不是空格的情况下启用,您可以使用以下内容获取修剪后的文本,检查修剪后的文本是否有长度> 0:

NSUInteger textLength = [myString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

【讨论】:

这会给系统带来很大压力吗? @milesper 不是很费力的方式。【参考方案2】:

在您的 .h 文件中

@interface YourViewController : UIViewController <UITextFieldDelegate>

在您的 .m 文件中

在 viewDidLoad 中写这个

self.btnSignUp.enable=NO;  //button is disable by default
self.textField1.delegate=self;  // set delegate of text field
self.textField2.delegate=self;
self.textField3.delegate=self;
self.textField4.delegate=self;

编写此文本字段的委托方法

-(void)textFieldDidEndEditing:(UITextField *)textField   


     if ([textField1.text length]>0 && [textField2.text length]>0 && [textField3.text length]>0 && [textField4.text length]>0)   // check if all the textfields are filled
    
        self.btnSignUp.enabled:YES;   // enable button here
    


【讨论】:

对代码的解释将不胜感激。另外,不要将点表示法与括号表示法混合使用。 你能给出一个合适的理由吗?为什么任何人都不应该将点表示法与括号表示法混合使用。这对我和其他用户都有帮助。谢谢。 您的代码会显得丑陋和笨拙,并且不会遵循传统的编码约定。这将很危险并且容易出现语法错误。【参考方案3】:

我知道这是比较老的,但我想提出另一个想法。我刚刚使用 UITextFieldTextDidChangeNotification 实现了这个。

注册通知:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("textFieldDidChange:"), name: "UITextFieldTextDidChangeNotification", object: nil)

添加处理通知的方法。 仅当所有文本字段都不为空时,才将按钮的 enabled 属性设置为 true。 对于 20 个文本字段,这不是一个很好的解决方案,但对于 2 - 5 个就可以了。

 func textFieldDidChange(notification: NSNotification) 
    self.button.enabled = self.firstField.text != "" && self.secondField.text != ""

每次文本字段的内容更改时都会调用该方法,因此按钮会实时响应。

【讨论】:

他们也应该删除viewWillDisappear中的通知。【参考方案4】:

我会以稍微不同的方式处理这个问题。 我不会经历启用/禁用UIButton 的麻烦,而是让UIButton 一直启用,并让它的目标操作方法决定要做什么。

例子:

//Sign Up button method
-(IBAction)btnSignUp:(UIButton *)sender

    //create a local array of the monitored textFields that should NOT be empty
    NSArray *arrTextFields = @[txtF1,txtF2,txtF3,txtF4];

    //helps quicken the process by using fast-enumeration as so:
    for (UITextField *txtFCurrent in arrTextFields) 
        if ([[txtFCurrent.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString:@""]) 
            NSLog(@"%@ found to be empty",txtFCurrent);

            //help direct the user to fill it
            //maybe after showing an alert but anyways...
            [txtFCurrent becomeFirstResponder];

            //don't proceed with the main button logic
            //since a required textField is empty
            return;
        
    

    //else...
    NSLog(@"All textfields are go... Proceed with the sign up request");
    //...

【讨论】:

以上是关于如果所有文本字段都填写在 ios 中,则启用按钮的主要内容,如果未能解决你的问题,请参考以下文章

当所有文本字段都填写在uitableviewcell(SWIFT)中时如何启用按钮

仅当所有文本字段都已填写时才在 Swift 中启用按钮

当所有字段都被填写后,启用提交按钮

用户在 Swift 中提交所有文本字段后如何启用按钮

iOS 6 UITextField Secure - 如何检测退格清除所有字符?

字段为空时为 UISearchBar 启用“搜索”按钮? (IOS 7)