Я расширяюсь UIButton
с универсальной функциональностью для изменения определенных атрибутов появления на основе отображенного заголовка.
Чтобы сделать это, я должен обнаружить и ответить на изменения в свойстве "состояния". Это так, я удостоверяюсь, что появление корректируется правильно, если пользователь установил различные заголовки для различных состояний. Я предположил, что должен буду использовать своего рода KVO как следующее:
[self addObserver:self
forKeyPath:@"state"
options:NSKeyValueObservingOptionNew
context:nil];
Но это, кажется, не запускает observeValueForKeyPath:... метод для "состояние" или "currentTitle". Я предполагаю, что это вызвано тем, что UIButton не реализует шаблон KVO для тех свойств.
Я не хочу просто прислушиваться к щелчкам. Те события вызывают изменение состояния, но не являются единственными потенциальными причинами.
Кто-либо знает способ слушать и ответить на изменения состояния UIButton?
Спасибо
Просто примечание, так как я изучил несколько вещей в прошлых годах пары ;).
Я с тех пор говорил с некоторыми людьми Apple, которые знают, и причина, KVO не работает над государственной собственностью, должна тому, что НИ ОДИН из UIKit, как не гарантируют, будет KVO совместимый. Мысль, которую стоило повторить здесь - при попытке слушать свойство класса платформы UIKit, знать, что это может работать, но официально не поддерживается и могла повредиться на различных версиях iOS.
Хорошо, я нашел решение, которое работает. Вы можете прослушать текстовое свойство кнопки titleLabel.
[self.titleLabel addObserver:self
forKeyPath:@"text"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:nil];
Кажется, что он запускается дважды за каждое изменение, поэтому вам следует убедиться, что значения @ "old" и @ "new" в переданном словаре изменений различны.
ПРИМЕЧАНИЕ. Не используйте напрямую @ "old" и @ "new". Константы - это NSKeyValueChangeOldKey и NSKeyValueChangeNewKey соответственно.
Подкласс UIButton, переопределить setState: это то, что у меня работает. Это, наверное, не лучший способ, но у меня это получилось.
Приносим извинения за приведенный выше ответ, это было неверно. Надо было действительно взглянуть на мой код. В моем случае мне нужно было только изменить состояние на основе выделения, поэтому я переопределил - setHighlight:
, чтобы изменить нужные мне значения. YMMV.