включение UIBarButtonItem, когда текстовое поле имеет ввод - PullRequest
3 голосов
/ 10 марта 2011

Я пытаюсь отключить кнопку отправки (UIBarButtonItem на панели инструментов) всякий раз, когда нет ввода в UITextField «userInput», и включить ее, когда она есть. Вот код, который я написал - я не могу понять, почему он не работает.

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

if (userInput.text.length >0) {
    [sendButton setEnabled:YES];
}else{
    [sendButton setEnabled:NO];
}

}

Я также получаю предупреждение о том, что «управление достигает конца не пустой функции».

Я очень плохо знаком с xcode и программированием, поэтому я не уверен, что это говорит мне.

Спасибо за любую помощь !!

Ответы [ 4 ]

3 голосов
/ 10 марта 2011

Объект текстового поля отправляет сообщение shouldChangeCharactersInRange своему делегату с вопросом, разрешено ли изменение (добавление нового символа или удаление символа) или нет. Поскольку вы не хотите отказываться от каких-либо изменений, внесенных в само текстовое поле, вы должны вернуть YES из этого метода. Предупреждение

control reaches end of non-void function

означает, что у вас есть не пустая функция, поэтому вы должны что-то вернуть. Так как ничего не возвращалось, это сообщение появилось.

Важно помнить, что этот метод делегата вызывается до изменения, что имеет смысл, поскольку у делегата запрашивается разрешение на разрешение или запрещение изменения. Если делегат отказывается, значение текстового поля останется неизменным независимо от того, что пользователь вводит. * * 1010

Так что вызов userInput.text бесполезен, потому что он вернет старое значение, так как изменение еще не было сделано. Однако в параметрах этого метода достаточно информации, чтобы построить новое значение текстового поля.

NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]);

Полный метод будет выглядеть так:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    BOOL isFieldEmpty = [newText isEqualToString:@""];
    sendButton.enabled = !isFieldEmpty;
    return YES;
}
0 голосов
/ 01 сентября 2013

В вашем контроллере добавьте (слабые) выходы для UITextView и UIBarButtonItem и подключите их к отображаемым элементам.

Добавьте еще один IBAction в контроллер, например:

- (void)textChanged:(id)sender
{
     if ( [self.someTextField.text length] > 0 )
         [self.someBarButtonItem setEnabled:YES];
     else [self.someBarButtonItem setEnabled:NO];
}

Подключите UITextView Edit Changed событие к textChanged:, который вы только что создали.Edit Changed даже срабатывает, когда символы вводятся в UITextField, вы проверяете длину текста и включаете / отключаете UIBarButtonItem, когда в текстовом поле есть какой-то текст.

Вы также можете в viewDidLoad: Проверьте начальную длину текста и включите / отключите кнопку в зависимости от текста.

Надеюсь, что это поможет.У меня работает в iOS 6.1.

0 голосов
/ 10 марта 2011
 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    if (userInput.text.length >0) {
        [sendButton setEnabled:YES];
    }else{
        [sendButton setEnabled:NO];
    }
    return YES;
    }
0 голосов
/ 10 марта 2011

хорошо, вам нужно в set enable NO в vieWillAppear

-(void)viewWillAppear:(BOOL)animated
{
  [self.sendButton setEnabled:NO];

}

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

if (userInput.text.length >0) {
    [self.sendButton setEnabled:YES];
}else{
    [self.sendButton setEnabled:NO];
    }
   return YES;
}

сделать UIBarButton как свойство и IBOUtlet и установить правильное соединение

.h

UIBarButton *sendButton;

@property(nonatomic,retain) IBOutlet UIBarButton *sendButton;

и в.m

@synthesize sendButton;

и

-(void)dealloc
{
  [self.sendButton release];
  [super dealloc];
}

, а также не забудьте установить соединение для textField с IB.

...