禁用按钮,直到输入文本字段?

时间:2010-05-18 18:11:23

标签: iphone objective-c validation uibutton uitextfield

我在视图中有几个uitextfields,我想禁用uibutton,直到所有字段都输入了一些内容。这样做的最佳方法是什么? 理想情况下,我也想做一些基本的验证(确保所有条目都是数字)。


修改

无法让下面的解决方案完全奏效。下面是我工作的版本(由Brad,Mike和其他各种来源拼凑而成)

使用UITextFieldDelegate

在IB中创建文本字段,并附加到相关的IBOutlets - textField1,textField2等

在IB中创建并将按钮连接到其相关的IBOutlet(submitButton)和IBAction(submitAction)。在IB中取消选中已启用。

在视图控制器中创建一个validate方法:

-(IBAction)validateTextFields:(id)sender
    {
        // make sure all fields are have something in them
        if ((textField1.text.length  > 0) && (textField2.text.length > 0)  && (textField3.text.length > 0)) {
            self.submitButton.enabled = YES;
        }
        else {
            self.submitButton.enabled = NO;
        }
    }

将每个字段'Editing Changed'事件连接到validateTextFields方法。 (注意:'Value Changed'事件似乎不起作用)

使用此委托方法限制字符(在我的情况下为数字,最多为一个句号)。这一位来自Erica Sadun btw。

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSCharacterSet *cs;
    NSString *filtered;
    // Check for period
    if ([textField.text rangeOfString:@"."].location == NSNotFound)
    {
        cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
        filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
        return [string isEqualToString:filtered];
    }
    // Period is in use
    cs = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
    filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return [string isEqualToString:filtered];
}

瞧。

4 个答案:

答案 0 :(得分:5)

您需要在管理视图的视图cOntroller中的所有文本字段上实现UITextFieldDelegate委托,确保在加载视图后验证文本字段:

-(void) viewDidLoad {
  textField1.delegate = self;  //Note if these were created in a xib, you can do this in IB
  textField2.delegate = self;
  [self validateTextFields];
}

并实现textField:shouldChangeCharatersInRage:方法,以便每次textfileds更改时进行验证:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  [self validateTextFields];
  return YES;
}

最后,根据需要进行实际验证并启用或禁用按钮:

-(void) validateTextFields {
  if ((textField1.text.length > 0) && textField2.text.length > 0)) {
    myUIButton.enabled = YES;
  }
  else {
    myUIButton.enabled = NO;
  }
}

答案 1 :(得分:3)

将自己设置为文本字段的委托并处理textFieldDidEndEditing:方法。在这种方法中,您可以进行验证:

- (void)textFieldDidEndEditing:(UITextField *)textField {
     myButton.enabled = (myTextField1.text.length && myTextField2.length);
}

答案 2 :(得分:2)

我不喜欢布拉德的回答,因为你总是一个人物。由于shouldChangeCharactersInRange的工作方式,您输入文本的最后一个文本字段必须至少包含两个字符。这是我发现更有帮助的解决方案:

夫特:

//This line goes in viewDidLoad
field.addTarget(self, action: #selector(self.validateTextFields), forControlEvents: UIControlEvents.EditingChanged)

func validateTextFields() {

        if field.text != "" {
            registerButton.enabled = true

        } else {

            registerButton.enabled = false
        }
}

目标-C:

//This line goes in viewDidLoad
[myTextField addTarget:self 
                action:@selector(textFieldDidChange)
      forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChange
{
    if ([self.myTextField.text isEqualToString:@""]) {
        [self.button setEnabled:NO];
    }
    else {
        [self.button setEnabled:YES];
    }
}

该解决方案也不要求您将最近的字段作为第一响应者重新签名,我觉得这很有用,因为只要文本字段的文本从空字符串更改,按钮的状态就会改变发短信。

答案 3 :(得分:1)

基于Jacob的例子的Swift 3变体。

//
//  ViewController.swift
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var txtTextField: UITextField!
    @IBOutlet weak var btnButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Ensure that only valid changes to txtTextField enable btnButton
        txtTextField.addTarget(self, action: #selector(self.validateTextField), for: UIControlEvents.editingChanged)
    }

    func validateTextField() {
        let validValue = txtTextField.text!.trimmingCharacters(in: CharacterSet.whitespaces)

        btnButton.isEnabled = validValue == "" ? false : true
    }
}