Каков наилучший способ получения уведомлений об изменениях выбора UITextField? - PullRequest
5 голосов
/ 20 декабря 2011

Использование центра уведомлений, как описано в Как я могу получить метод textDidChange (например, для UISearchBar) для UITextField? , позволяет получать уведомление при изменении текста в iOS UITextField. Я не видел подобное уведомление для изменений выбора. Каков наилучший способ обнаружения изменений в выделении для UITextField и реагирования на них?

Ответы [ 3 ]

0 голосов
/ 26 июня 2015

Эта ссылка имеет одно решение, не связанное с частным apis:

Вкратце: создайте подкласс UITextField, реализуйте

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

и проверьте, изменился ли диапазон выбора,Но это не уведомляет о касаниях.

Итак, после подкласса я наблюдал свойство selectedTextRange:

-(void)awakeFromNib {
    [self addObserver:self forKeyPath:@"selectedTextRange" options:0 context:nil];
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    [self notifyDelegateIfNecessary];
}

Очень хорошо работает в iOS8.

0 голосов
/ 18 декабря 2015

Существует простой способ обнаружить выделение в textField

добавить наблюдателя свойства объекта в viewDidAppear

  [self.keyboardInputFieldPassword addObserver:self forKeyPath:@"selectedTextRange" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld  context:nil];

Затем добавьте функцию наблюдения для свойства

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if([keyPath isEqualToString:@"selectedTextRange"] && self.keyboardInputFieldPassword == object)
        [self textFieldDidChangeSelection:self.keyboardInputFieldPassword];
}

Это захватит диапазон выбора в UITextField

Для соблюдения соглашения следует удалить Observer в viewDidDisappear

[self.keyboardInputFieldPassword removeObserver:self forKeyPath:@"selectedTextRange" context:nil];
0 голосов
/ 20 декабря 2011

Подключите метод с помощью target / action к управляющему событию UIControlEventEditingChanged в вашем экземпляре UITextField. Это можно сделать в конструкторе интерфейса или в коде, добавив пару «цель / действие» в текстовое поле, а затем реализовав указанный метод.

[self.textField addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged];

UITextField также объявляет протокол UITextFieldDelegate с методами, которые вы можете реализовать в своем классе, чтобы получать уведомления об изменениях в экземпляре UITextField. Я рекомендую вам освоиться с делегированием, поскольку это обычная схема в структуре Какао.

Ссылка на класс UITextFieldDelegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...