启用/禁用 UIButton 取决于 UITextField 中的文本长度

Posted

技术标签:

【中文标题】启用/禁用 UIButton 取决于 UITextField 中的文本长度【英文标题】:Enable/Disable UIButton depends on length of text in UITextField 【发布时间】:2018-02-20 11:34:20 【问题描述】:

我有一个包含 3 个静态单元格的 tableViewController。 每个单元格都有一个 UITextField。

我正在尝试计算每个 textField 中的文本长度以启用或禁用按钮。

为此,我使用了 textField 委托方法

-textField:shouldChangeCharactersInRange:replacementString:

但我无法获得正确的值,例如在密码字段中,我想在长度超过 6 个字母时启用按钮,并在长度小于 6 个字母时禁用按钮。

目前我无法获得正确的长度,例如要禁用密码字段中的按钮,我需要达到 3 个字符,否则它不会被禁用。这对我来说是错误的,因为当字符小于 6 时按钮必须禁用。

这是我的代码,你能解释一下我哪里错了吗?

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

     if ([self.passwordTextField.text length] >6 && [self.nameTextField.text length] >2 && [self.emailTextField.text length] >2) [self.stepCompleted setEnabled:YES];

     else if ([self.passwordTextField.text length]  <6 || [self.nameTextField.text length] <2 || [self.emailTextField.text length] <2) [self.stepCompleted setEnabled:NO];


    return YES;

【问题讨论】:

你有3个UITextFields,你需要使用哪个条件启用和禁用一个按钮???我认为你的第一个 if 语句永远不会是真的,因为同一个 UItextField 不能同时等于一个和等于另一个,如果你提供一个明确的答案来说明你遵循哪些标准,我可以为此提供答案我认为 @ReinierMelian 所以......我正在创建一个 tableviewcontroller 来为我的应用程序注册用户。我希望这个 tableView 控制器显示 3 个文本字段来输入用户名、电子邮件和密码。当键盘出现时,上面有一个键(“继续下一步”),这个键删除了tableView控制器并呈现了一个新的视图控制器,用于下一步的录制。 @ReinierMelian 示例:只有在填写了所有三个文本字段(名称至少 2 个字符、电子邮件至少 2 个字符、密码至少 6 个字符)时,我才需要启用按钮。当这些文本字段之一包含字符少于所需字符的文本时,必须禁用该按钮。即使用户使用文本字段的清除按钮或按钮删除键盘字符,这种情况也必须发生 好的,我会审核的 【参考方案1】:

首先您需要检查textfield == self.passwordTextField 或任何其他文本字段是否包含然后您应用您的条件。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    if (string==nil || [string isEqualToString:@""] || [string isKindOfClass:[NSNull class]] || string.length < 1)
    
        if([self.nameTextField.text length] < 2 || [self.emailTextField.text length] < 2 || [self.passwordTextField.text length] < 6)
        
            [self.stepCompleted setEnabled:NO];
        
    
    else if(textField == self.passwordTextField && [self.passwordTextField.text length] > 6)
    
        if([self.nameTextField.text length] > 2 && [self.emailTextField.text length] > 2)
        
            [self.stepCompleted setEnabled:YES];
        
        else
        
            [self.stepCompleted setEnabled:NO];
        
    
    else if(textField == self.nameTextField && [self.nameTextField.text length] > 2)
    
        if([self.passwordTextField.text length] > 6 && [self.emailTextField.text length] > 2)
        
            [self.stepCompleted setEnabled:YES];
        
        else
        
            [self.stepCompleted setEnabled:NO];
        
    
    else if(textField == self.emailTextField && [self.emailTextField.text length] > 2)
    
        if([self.nameTextField.text length] > 2 && [self.passwordTextField.text length] > 6)
        
            [self.stepCompleted setEnabled:YES];
        
        else
        
            [self.stepCompleted setEnabled:NO];
        
    
    return YES;

【讨论】:

您已经检查了 6, > 2 条件。 == 6 呢?根据您的要求更改 如果我使用 == 6 之后的所有字符 6 禁用按钮...即使我是 7 或 8 岁,我也需要 6 个字符来启用按钮 我在删除字符时一直遇到问题...似乎我不尊重 您需要符合 newString 因为当前的 textField.text 包含添加新字符之前的文本,因此您需要改为检查新字符串 @NiravKotecha 我的回答与你的非常相似......感谢你,我能够理解我的错误,并且我重建了目前不会给我带来任何问题的代码......再次感谢【参考方案2】:

您好,找到这个问题的解决方案.. 如果我们需要建立在多个UITextField 中使用的最小字符数,我们可以为我们感兴趣的文本字段建立一个最小限制,并控制方法中剩余文本字段的行为...

Es.. 我们有 3 个UITextField 姓名 - 电子邮件 - 密码

在本例中,如果文本字段的字符数最少,我们希望启用或禁用按钮

-(BOOL)textFieldShouldClear:(UITextField *)textField 
    [button setEnabled:NO];
    return YES;


-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    // Otteniamo il numero di caratteri corretti
    NSString *characters = [textField.text stringByReplacingCharactersInRange:range withString:string];

    int minimumCharacter = 2;
    int minimumCharacterForPassoword = 6;

     // Identifichiamo la textField Generica con la textField che andremo ad utilizzare inoltre aggiungiamo anche il numero di caratteri MINIMI che vogliamo utilizzare per attivare il bottone Continua e quindi consentire all'utente di proseguire con la registrazione, altrimenti, se non tutti i requisiti delle textField vengono soddisfatti disabilitiamo il pulsante Continua fino a quando tutti campi non saranno completati

    // NAME
    if (textField == self.firstNameTextField) 
        if  (characters.length >= minimumCharacter) 
            if ((self.passwordTextField.text.length +1) > minimumCharacterForPassoword && (self.emailTextField.text.length +1) > minimumCharacter) [_stepCompletedButton setEnabled:YES];
            else [_stepCompletedButton setEnabled:NO];
        
        else [_stepCompletedButton setEnabled:NO];
    

    // EMAIL
    if (textField == self.emailTextField) 
        if  (characters.length >= minimumCharacter) 
            if ((self.passwordTextField.text.length +1) > minimumCharacterForPassoword && (self.firstNameTextField.text.length +1) > minimumCharacter) [_stepCompletedButton setEnabled:YES];
            else [_stepCompletedButton setEnabled:NO];
        
        else [_stepCompletedButton setEnabled:NO];
    

    // PASSWORD
    if (textField == self.passwordTextField) 
        if  (characters.length >= minimumCharacterForPassoword) 
            if ((self.firstNameTextField.text.length +1) > minimumCharacter && (self.emailTextField.text.length +1) > minimumCharacter) [_stepCompletedButton setEnabled:YES];
            else [_stepCompletedButton setEnabled:NO];
        
        else [_stepCompletedButton setEnabled:NO];
    

    return YES;

【讨论】:

以上是关于启用/禁用 UIButton 取决于 UITextField 中的文本长度的主要内容,如果未能解决你的问题,请参考以下文章

在 IBAction 中禁用的 UIButton 重新启用自身

禁用 UILabel、UIText 等的自动调整字体。在 iOS/Swift 中?

如何禁用 UIButton 和禁用 touchEvent 响应程序?

UITextField 具有焦点时未禁用 UIButton

如何删除禁用的 UIButton 的灰色外观

剑道网格单元启用/禁用