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

Обнаружение изменения содержимого UITextField, когда изменение не производится с помощью клавиатуры

У меня есть UIButton и UITextField, когда кнопка нажата, строка содержимого текстового поля будет равна: This is a test string, как я могу обнаружить, что это текстовое поле изменило его содержимое в этом случае?

p.s. UITextField's методы делегата не работают в таком случае

ОБНОВЛЕНИЕ: Я хочу, чтобы это поведение было на устройствах iOS 6+.

4b9b3361

Ответ 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...
}

Пробовал ли это?