Подкласс UITextView как сам делегат
Скажем, я добавляю UITextView
к моему UIView
, и я хочу, чтобы он менял свой цвет фона при каждом изменении содержимого. Я могу сделать это, став делегатом UITextView
и внедряя textViewDidChange
.
Если я часто использую это поведение, имеет смысл создать подкласс UITextView
, который я буду называть ColorSwitchingTextView
. Он должен включать поведение переключения цвета по умолчанию, так что любой UIView
может просто добавить его вместо стандартного UITextView
, если он хочет этого поведения.
Как определить изменения в содержимом из моего класса ColorSwitchingTextView
? Я не думаю, что могу сделать что-то вроде self.delegate = self
.
В общем, как может подкласс UITextView
знать, когда изменяется его содержимое?
ИЗМЕНИТЬ
Кажется, я могу использовать self.delegate = self
, но это означает, что UIViewController, который использует ColorSwitchingTextView
, также не может подписаться на уведомления. Когда я использую switchingTextView.delegate = self
в контроллере представления, поведение подкласса больше не работает. Любые обходные пути? Я пытаюсь получить пользовательский UITextView
, который в противном случае работает как обычный UITextView
.
Ответы
Ответ 1
В своем подклассе прослушайте уведомление UITextViewTextDidChangeNotification
и обновите цвет фона при получении уведомления, например:
/*
* When you initialize your class (in `initWithFrame:` and `initWithCoder:`),
* listen for the notification:
*/
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(myTextDidChange)
name:UITextViewTextDidChangeNotification
object:self];
...
// Implement the method which is called when our text changes:
- (void)myTextDidChange
{
// Change the background color
}
- (void)dealloc
{
// Stop listening when deallocating your class:
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
Ответ 2
Лучше сделать это с самого начала.
Что Apple и SOLID предложили бы, это подкласс не UITextView, , а UIView. В пользовательском UIColorTextView у вас будет член UITextView в качестве подзаголовка, и ваш UIColorTextView будет делегатом. Кроме того, ваш UIColorTextView будет иметь свой собственный делегат и передаст необходимые делегатские обратные вызовы из UITextView для его делегирования.
У меня была такая задача не с UITextView, а с UIScrollView.
Ответ 3
В вашем подклассе добавьте self
в качестве наблюдателя в UITextViewTextDidChangeNotification
.
Тем не менее, я не согласен с продолжающимся разговором, что установка self
, поскольку делегат - плохая идея. Для этого конкретного случая, конечно, но только потому, что есть лучший способ (UITextViewTextDidChangeNotification).
Ответ 4
Вы можете использовать NSNotificationCenter.
Установите делегата в себя в подкласс (никогда не пробовал это, но вы сказали, что он работает), а затем в контроллере представления вы хотите получать уведомления, сделайте
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(textFieldDidBeginEditing:)
name:@"TextFieldDidNotification" object:nil];
и в подклассе:
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self forKey:@"textField"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TextFieldDidBeginEditingNotification" object:self userInfo:userInfo]
Теперь вы также можете передавать любую другую информацию в словаре.