Как я могу обнаружить любые изменения текста в textField? Метод делегата shouldChangeCharactersInRange
работает для чего-то, но он не полностью соответствует моим потребностям. Так как, пока это не возвращает ДА, тексты textField не доступны для других методов наблюдателя.
например в мой код calculateAndUpdateTextFields
не попал обновленный текст, пользователь набрал.
Есть ли у них какой-нибудь способ получить что-то вроде textChanged
обработчика событий Java.
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
Ответы:
От правильного способа сделать текстовое изменение uitextfield перезвоните :
В Objective-C:
В Свифте:
Вы могли бы использовать это и поместить CalcuAndUpdateTextFields в качестве вашего
selector
.источник
NO
, что логично, потому что когда вы возвращаетесьNO
из этого метода, вы в основном говорите, что текст в поле не должен изменяться.textField.text = "Some new value";
. Есть ли умный способ поймать это?UITextFieldDelegate
что что-то подобноеfunc textField: UITextField, didChangeText text: String
было бы включено, но ... (бросает на парней в Apple грязный взгляд)Ответ XenElement точен.
Вышесказанное можно сделать и в конструкторе интерфейсов, щелкнув правой кнопкой мыши на UITextField и перетащив событие отправки «Редактирование изменено» на ваш подкласс.
источник
установить слушателя события:
на самом деле слушать:
источник
Swift:
Затем реализуйте функцию обратного вызова:
источник
Как указано здесь: событие изменения текста UITextField , похоже, что в iOS 6 (iOS 6.0 и 6.1 проверено) невозможно полностью обнаружить изменения в
UITextField
объектах, просто наблюдаяUITextFieldTextDidChangeNotification
.Кажется, что теперь отслеживаются только те изменения, которые были сделаны непосредственно встроенной клавиатурой iOS. Это означает, что если вы измените свой
UITextField
объект, просто вызвав что-то вроде этого:,myUITextField.text = @"any_text"
вы не будете уведомлены о каких-либо изменениях вообще.Я не знаю, если это ошибка или она предназначена. Похоже, ошибка, так как я не нашел разумного объяснения в документации. Это также указано здесь: UITextField событие изменения текста .
Мое «решение» этого заключается в том, чтобы фактически публиковать уведомление самостоятельно для каждого изменения, которое я делаю в моем
UITextField
(если это изменение сделано без использования встроенной клавиатуры iOS). Что-то вроде этого:Таким образом, вы на 100% уверены, что получите такое же уведомление при изменении
.text
свойства вашегоUITextField
объекта, либо когда вы обновите его «вручную» в своем коде, либо через встроенную клавиатуру iOS.Важно учитывать, что, поскольку это не задокументированное поведение, такой подход может привести к получению 2 уведомлений об одном и том же изменении вашего
UITextField
объекта. В зависимости от ваших потребностей (что вы на самом деле делаете, когда вашиUITextField.text
изменения) это может быть неудобно для вас.Немного другой подход заключается в публикации пользовательского уведомления (то есть с другим именем, отличным от
UITextFieldTextDidChangeNotification
), если вам действительно нужно знать, было ли это уведомление вашим или «созданным на iOS».РЕДАКТИРОВАТЬ:
Я только что нашел другой подход, который, я думаю, мог бы быть лучше:
Это включает функцию наблюдения значения ключа (KVO) в Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
По сути, вы регистрируетесь как наблюдатель собственности, и если это свойство изменяется, вы получаете уведомление об этом. «Принцип» очень похож на то, как
NSNotificationCenter
работает, и является главным преимуществом, что этот подход работает автоматически, также как и в iOS 6 (без какой-либо специальной настройки, такой как необходимость вручную отправлять уведомления).Для нашего
UITextField
сценария это прекрасно работает, если вы добавите этот код, например, вUIViewController
тот , который содержит текстовое поле:Отдайте должное этому ответу об управлении контекстом: https://stackoverflow.com/a/12097161/2078512
Примечание. Похоже, что во время редактирования
UITextField
с помощью встроенной клавиатуры iOS свойство «текст» текстового поля не обновляется при вводе / удалении каждой новой буквы. Вместо этого объект текстового поля обновляется «в целом» после того, как вы отказываетесь от статуса первого респондента текстового поля.источник
Мы можем легко настроить это
Storyboard
, CTRL перетащить@IBAction
событие и изменить следующим образом:источник
Здесь в быстрой версии для того же.
Спасибо
источник
Я решил проблему, изменив поведение shouldChangeChractersInRange. Если вы вернете НЕТ, изменения не будут применены iOS внутренне, вместо этого у вас есть возможность изменить его вручную и выполнить любые действия после изменений.
источник
Версия Swift протестирована:
Параметры объяснили:
Затем добавьте метод, который вы создали выше в вашем
UIViewController
:источник
Swift 4
источник
Для Swift 3.0:
используя класс как:
источник
Версия Swift 3
И получить изменения здесь
Надеюсь, поможет.
источник
Вы должны использовать уведомление для решения этой проблемы, потому что другой метод будет прослушивать поле ввода, а не фактический ввод, особенно когда вы используете китайский метод ввода. В viewDidload
тогда
}
наконец, вы бежите, будет сделано.
источник
Swift 3.1:
источник
Версия Swift 3:
Не забудьте установить делегата.
источник
С закрытием:
и используя
источник
KVO НЕ работает в iOS для элементов управления: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html
Учитывая, что вы знаете текстовое представление, которое хотите посмотреть:
Сделай это:
Однако будьте осторожны с этим:
скорее всего, вы хотите позвонить только один раз , поэтому не вызывайте его, например,
layoutSubviews
довольно сложно понять, когда лучше всего позвонить во время процесса воспитания. Это будет зависеть от вашей ситуации. К сожалению, нет стандартного, закрытого решения
например, вы обычно наверняка не можете позвонить
init
вовремя, поскольку, конечно, ещеwatchedTextView
не может существовать,
Ни одно из уведомлений не вызывается, когда текст изменяется программно .
Это огромное, давнее и глупое неудобство в разработке iOS.
Элементы управления просто не - конец истории - вызывают уведомления, когда свойство .text изменяется программно.
Это безумно раздражает, потому что, конечно же, очевидно, что каждое приложение, которое когда-либо создавалось, устанавливает текст программно, например, очищает поле после сообщений пользователя и т. Д.
Вы должны создать подкласс текстового представления (или аналогичного элемента управления) следующим образом:
(Совет - не забывайте, что супер звонок должен прийти раньше ! После звонка.)
Там является не доступным решением, если вы не исправить управление по подклассам , как показано чуть выше. Это единственное решение.
Обратите внимание, что уведомление
результаты в
будучи призванным
( Не
textViewDidChange
.)источник
источник
Во-первых, у вас может быть несколько UITextFields. Итак, дайте им тег, а затем вы можете включить теги. Вот как настроить наблюдателя в любом классе.
источник
Версия Swift 4
Использование наблюдения значения ключа Оповещайте объекты об изменениях свойств других объектов.
источник