Обнаружение изменения содержимого UITextField, когда изменение не производится с помощью клавиатуры
У меня есть UIButton
и UITextField
, когда кнопка нажата, строка содержимого текстового поля будет равна: This is a test string
, как я могу обнаружить, что это текстовое поле изменило его содержимое в этом случае?
p.s. UITextField's
методы делегата не работают в таком случае
ОБНОВЛЕНИЕ: Я хочу, чтобы это поведение было на устройствах iOS 6+.
Ответы
Ответ 1
Возможно, будет работать простой наблюдение за ключевыми значениями?
[textField addObserver:self forKeyPath:@"text" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"text"] && object == textField) {
// text has changed
}
}
Изменить: я только что проверил его, и он работает для меня.
Ответ 2
Вы можете добавить UITextFieldTextDidChangeNotification
:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:textField];
textField
(объект param) - ваш UITextField.
selector
- это ваш метод, который будет вызываться, когда это уведомление было запущено.
Ответ 3
Вы можете обрабатывать изменение текста в событии UIControlEventEditingChanged
. Поэтому, когда вы меняете текстовую программу, просто отправьте это событие:
textField.text = @"This is a test string";
[textField sendActionsForControlEvents:UIControlEventEditingChanged];
Ответ 4
Метод делегата может действительно работать для вас. Вы получите текстовое поле, диапазон, который изменится, и новую строку. Вы можете объединить их для определения предложенной строки.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSMutableString *proposed = [NSMutableString stringWithString:textField.text];
[proposed replaceCharactersInRange:range withString:string];
NSLog(@"%@", proposed);
// Do stuff.
return YES; // Or NO. Whatever. It your function.
}
Ответ 5
Это довольно надежное решение, но оно должно работать. В вашей функции, которая вызывается при нажатии кнопки...
NSString *string = [NSString stringWithFormat:@"This is a test string"];
if(string == textfield.text){
...
}
Или вы можете нам самостоятельно планировщик, чтобы проверить, не изменилось ли оно.
Ответ 6
Вот версия акашивского варианта Swift3:
func startObservingTextView() {
textView.addObserver(self, forKeyPath:"text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
}
func stopObservingTextView() {
textView.removeObserver(self, forKeyPath: "text")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let textViewObject = object as? UITextView, textViewObject == textView, keyPath == "text" {
// text has changed
}
}
Ответ 7
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
//You code here...
}
Пробовал ли это?