2013-03-19 2 views

ответ

29

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

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

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

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

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

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

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

Спасибо за помощь, но я борюсь с синтаксисом. Я думаю, что это должно быть что-то вроде этого - (Недействительными) UITextFieldTextDidChange: (UITextField *) TextField { действие взять } , но это не похоже на работу – RGriffiths

+0

Для уведомлений необходимо зарегистрировать наблюдателя для уведомления с NSNotificationCenter , Взгляните на документацию Apple для NSNotificationCenter. Это очень распространенная модель разработки приложений для iOS и Mac OS X. –

+0

Спасибо за вашу помощь - я посмотрел и просто не вижу, что мне делать. Извините - новичок в этом. – RGriffiths

-3

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

changetemp = textfield; 

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

Вы можете создать переменную для хранения исходной строки, а затем зарегистрироваться в центре уведомления получить 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]; 
9

Для этого сначала вам нужно, чтобы ваше текстовое поле присвоило ему заданную ссылку. И деггейт, предпочтительно, должен быть контроллером 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 Вы можете найти, как это сделать here.

+0

Опять же, я очень ценю эту помощь, но разве это не просто просмотр текста? (т.е. длина теперь> 0). В текстовом поле есть текст, и я хочу определить, изменилось ли оно. – RGriffiths

+0

@RichardGriffiths Извините, я думал, что вы хотите проверить наличие контента, я исправил его сейчас. Вы пытаетесь поместить текст заполнителя? –

+2

Это правильный ответ, не знаю, почему он не принят. Этот конкретный метод будет запускаться всякий раз, когда новый символ вводится или удаляется. Если вы просто хотите проверить, больше ли длина содержимого больше 0, используйте один из других методов делегата, например, didBeginEditing, ect – barndog

36

Вместо наблюдения уведомления или реализации 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 еще не дал вам текст, который только что вводил пользователь, - вам придется сначала применить изменение.
+0

Как я могу обнаружить событие нажатия клавиши Backspace в этом методе «myTextFieldDidChange». Значит, вы могли бы объяснить, что «вам придется сначала применить изменение». часть из вашего ответа? – ViruMax

+1

@ViruMax: уведомление не предназначено для обнаружения одиночных нажатий клавиш. Однако, если вы сохраните значение текстового поля в свойстве, которое вы обновляете в обработчике уведомлений, вы можете сравнить длины перед обновлением свойства, и вы, таким образом, знаете, были ли удалены, заменены или добавлены символы. Что касается «вам придется применить изменение самостоятельно»: см. [Ответ, который посвящен методу 'UITextFieldDelegate'] (http://stackoverflow.com/a/15490405/400056) (вам нужно вызвать' stringByReplacingCharactersInRange: withString : 'получить строку результата изменения). – DarkDust

1

Swift 3,0

Процесс 1

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

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

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

Например:

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

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

Смежные вопросы