Я хотел бы иметь возможность определить, изменился ли какой-либо текст в UITextField
, чтобы я мог затем включить UIButton
для сохранения изменений.
Обнаружение изменения текста в UITextfield
Ответ 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"):
}