Подтвердить что ты не робот

Обнаружение изменения текста в UITextfield

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

4b9b3361

Ответ 1

Воспользуйтесь преимуществом уведомления UITextFieldTextDidChange или установите делегат в текстовом поле и следите за textField:shouldChangeCharactersInRange:replacementString.

Если вы хотите отслеживать изменения с уведомлением, вам нужно что-то вроде этого в вашем коде, чтобы зарегистрироваться для notification:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChange:) name:UITextFieldTextDidChangeNotification object:theTextField];

Здесь theTextField - это экземпляр UITextField который вы хотите посмотреть. Класс которого self является экземпляром в приведенном выше коде, должен затем реализовать textFieldDidChange, например, так:

- (void)textFieldDidChange:(NSNotification *)notification {
    // Do whatever you like to respond to text changes here.
}

Если текстовое поле собирается пережить observer, необходимо отменить регистрацию для уведомлений в методе наблюдателя dealloc. На самом деле это хорошая идея, даже если текстовое поле не переживает наблюдателя.

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // Other dealloc work
}

Ответ 2

Вместо наблюдения уведомлений или реализации textField:shouldChangeCharacterInRange:replacementString: проще просто добавить цель события:

[textField addTarget:self
              action:@selector(myTextFieldDidChange:)
    forControlEvents:UIControlEventEditingChanged];

- (void)myTextFieldDidChange:(id)sender {
    // Handle change.
}

Обратите внимание, что событие UIControlEventEditingChanged и не UIControlEventValueChanged!

Преимущества двух других предлагаемых решений:

  • Вам не нужно забывать отменить регистрацию своего контроллера с помощью NSNotificationCenter.
  • Обработчик событий вызывается после того, как было сделано изменение, что означает, что textField.text содержит текст, введенный пользователем. Метод-делегат textField:shouldChangeCharacterInRange:replacementString: вызывается до того, как изменения были применены, поэтому textField.text еще не предоставил вам текст, который только что вводил пользователь, - вам придется сначала применить это изменение.

Ответ 3

Для этого сначала вам нужно, чтобы ваше текстовое поле передало ему делегированную ссылку. И деггейт, предпочтительно, должен быть контроллером vew, который является владельцем файлов представления. Который идет как

myTextField.delegate = myViewControllerReferenceVariable

И в вашем интерфейсе viewController скажите, что вы будете выполнять UITextFieldDelegate на

@interface MyViewController:UIViewController<UITextFieldDelegate>

И в вашем представлении переопределение реализации контроллера

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

Итак, код будет выглядеть как

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
     {
        text = [textfield.text stringByReplacingCharactersInRange:range withString:string];
        if (textfield == refToTextFieldYouWantToCheck) {
            if ( ! [textToCheck isEqualToString:text] ) {
               [theButtonRef setEnabled:YES];
            } 
         }
           return YES; //If you don't your textfield won't get any text in it
      }

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

Ответ 4

Swift 3.0

Процесс 1

Создать IBOutlet UITextfiled и Добавить Target в текстовое поле.

 m_lblTxt.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControlEvents.editingChanged)

 func textFieldDidChange(textField:UITextField)
 {
     NSLog(textField.text!)
 }

Процесс 2

 m_lblTxt.delegate = self

 //MARK: - TextField Delegates
 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
 {
      print(textField.text!)
      return true
 }

Ответ 5

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateButton:) name:UITextFieldTextDidChangeNotification object:nil];

Затем создайте метод для получения уведомления и сравните текущее значение текстового поля с исходным значением

-(void) updateButton:(NSNotification *)notification {
       self.myButton.enabled = ![self.myTextField.text isEqualToString:originalString];
}

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

[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];

Ответ 6

Это может быть выполнено в Interface Builder в событии Editing Changed UITextField. Перетащите его в свой код и создайте IBAction.

Например:

@IBAction func textFieldChanged(_ sender: UITextField) {
  print(sender.text)
}

Это событие аналогично описанному в других ответах здесь, в котором свойство .text содержит обновленный ввод текста при его запуске. Это может помочь очистить беспорядок кода, не имея необходимости программно добавлять событие к каждому UITextField в представлении.

Ответ 7

Вы можете добавить член класса, подобный этому NSString *changeTemp, затем

changetemp = textfield;

if( change temp != textfild ){
    changetemp=textfild;
    NSLog(@" text is changed"
} else { 
    NSLog(@" text isn't changed"):
}