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

Подкласс UITextView как сам делегат

Скажем, я добавляю UITextView к моему UIView, и я хочу, чтобы он менял свой цвет фона при каждом изменении содержимого. Я могу сделать это, став делегатом UITextView и внедряя textViewDidChange.

Если я часто использую это поведение, имеет смысл создать подкласс UITextView, который я буду называть ColorSwitchingTextView. Он должен включать поведение переключения цвета по умолчанию, так что любой UIView может просто добавить его вместо стандартного UITextView, если он хочет этого поведения.

Как определить изменения в содержимом из моего класса ColorSwitchingTextView? Я не думаю, что могу сделать что-то вроде self.delegate = self.

В общем, как может подкласс UITextView знать, когда изменяется его содержимое?

ИЗМЕНИТЬ Кажется, я могу использовать self.delegate = self, но это означает, что UIViewController, который использует ColorSwitchingTextView, также не может подписаться на уведомления. Когда я использую switchingTextView.delegate = self в контроллере представления, поведение подкласса больше не работает. Любые обходные пути? Я пытаюсь получить пользовательский UITextView, который в противном случае работает как обычный UITextView.

4b9b3361

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

Теперь вы также можете передавать любую другую информацию в словаре.