Отключить кнопку, пока текстовые поля не были введены? - PullRequest
7 голосов
/ 18 мая 2010

У меня есть несколько полей uitext в представлении, и я хотел бы отключить uibutton, пока во всех полях что-то не введено в них. Какой лучший способ сделать это? В идеале я хотел бы также провести некоторую базовую проверку (убедитесь, что все записи являются числами).


EDIT

Не удалось получить приведенные ниже решения для полной работы. Ниже приведена версия, с которой я работал (собранные вместе из Брэда, Майка и других источников)

Использовать UITextFieldDelegate

Создание текстовых полей в IB и присоединение к соответствующим IBOutlets - textField1, textField2 и т. Д.

Создайте и подключите кнопку к соответствующему IBOutlet (submitButton) и IBAction (submitAction) в IB. Снимите флажок в IB.

Создание метода проверки в контроллере представления:

-(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;
        }
    }

Подключите каждое событие 'Редактирование изменения' к методу validateTextFields. (Примечание: событие «Значение изменено» не работает)

Используйте этот метод делегата, чтобы ограничить количество символов (в моем случае цифрами и до одной точки). Этот бит от Эрики Садун, кстати.

-(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 ]

5 голосов
/ 18 мая 2010

Вы захотите внедрить делегат UITextFieldDelegate на всех ваших текстовых полях в представлении cOntroller, управляющем вашим представлением следующим образом, проверяя правильность ваших текстовых полей после загрузки представления:

-(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: метод, который должен проверяться каждый раз, когда изменяется текстовое поле:

 - (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;
  }
}
3 голосов
/ 18 мая 2010

Установите себя в качестве делегата текстовых полей и обработайте метод textFieldDidEndEditing: . В этом методе вы можете сделать свою проверку:

- (void)textFieldDidEndEditing:(UITextField *)textField {
     myButton.enabled = (myTextField1.text.length && myTextField2.length);
}
2 голосов
/ 11 мая 2016

Мне не понравился ответ Брэда, так как вы всегда на один персонаж позади. Последнее текстовое поле, в которое вы вводите текст, должно содержать не менее двух символов из-за способа работы shouldChangeCharactersInRange. Вот решение, которое я нашел гораздо более полезным:

Swift:

//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
        }
}

Objective-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];
    }
}

Решение также не требует от вас отставки самого последнего поля в качестве первого респондента, что я считаю полезным, поскольку состояние кнопки будет меняться всякий раз, когда текст вашего текстового поля меняется с пустой строки на текст.

1 голос
/ 21 июня 2017

Вариант 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
    }
}
...