кнопка отключения, когда текстовые поля пусты - PullRequest
5 голосов
/ 15 августа 2011

Привет, я новичок в программировании, застрял в этой задаче целую вечность и, кажется, ничего не получаю.

В основном у меня есть несколько текстовых полей, которые генерируют информацию ввода на другой странице, когда пользователь нажимаеткнопка.Я хотел бы, чтобы кнопка была отключена, пока все текстовые поля не заполнены информацией.

пока у меня есть это:

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

25 голосов
/ 15 августа 2011

Создайте розетку для каждого UITextField и создайте IBAction в вашем .h:

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

- (IBAction)editingChanged;

Соедините все выходы и подключите IBAction к каждому текстовому полю с помощью editChanged:

 - (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];
}
6 голосов
/ 20 декабря 2012

Если у вас есть кнопка и вы хотите включить ее только в том случае, если в текстовом поле или текстовом поле есть текст, используйте следующий метод

- (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 голосов
/ 28 июля 2015

На этих постах также доступно несколько решений

Ключ здесь использует (расширяет) класс 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
}
1 голос
/ 16 августа 2011

В дополнение к наличию IBOutlets для каждого UITextField может быть полезно объявить IBOutletCollection, который содержит все 3 текстовых поля в массиве.

@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;
}
1 голос
/ 15 августа 2011

Вы должны использовать «текстовое поле должно менять персонажей в диапазоне» (см. Документацию Apple для uitextviewdelegate).потому что он обновляется по мере того, как пользователь вводит информацию. «Текстовое поле завершило редактирование» запускается только тогда, когда пользователи заканчивают редактировать текстовое поле или нажимают ввод.В большинстве случаев кто-то заполнит последнее поле и оставит курсор там, ожидая, что кнопка станет активной ... но этого не произойдет, если «текстовое поле завершило редактирование» только потому, что он ввел ввод.

Вы также можете сделать это, чтобы проверить длину

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