Как сделать два класса делегатами UITextView?

У меня есть textView "TexV", у которого есть пользовательский класс "TexV_Class", унаследованный от UITextView, и у меня есть viewController "VC" с настраиваемым классом с именем "VC_Class"

Теперь, как я могу делегировать оба класса "TexV_Class" и "VC_Class" и заставить их работать вместе? Возможно ли, что один и тот же метод делегата (например, textViewDidChange) в ОБОИХ классах запускается (на данный момент оставляя последовательность выполнения)

Хотя я сделал оба класса делегатами, но работает только один (тот, что у VC_Class с запущенными методами делегирования textView)


person djay    schedule 04.07.2016    source источник
comment
Если вам это действительно нужно (возможно, вы захотите сначала пересмотреть структуру своего приложения), взгляните на MultiDelegate или ILABMultiDelegate. Есть некоторые подводные камни, использующие эти классы, но они хорошо документированы.   -  person Rok Jarc    schedule 04.07.2016


Ответы (2)


Вы не можете. Механизм делегата работает, имея один объект обратного вызова, если вы хотите, чтобы более одного элемента реагировали на основе делегата, вы можете обойти это одним из двух способов:

1- Отправьте уведомление одному из ваших делегатов, чтобы другой делегат мог действовать соответствующим образом.

2- установите пользовательский делегат в TexV_Class, который соответствует методу UITextView, который хочет принять VC_Class, и пусть TexV_Class вызовет этот делегат из своего обратного вызова делегата.

person Danny Bravo    schedule 04.07.2016

Я предлагаю вам 3 способа сделать это:

1) Используйте NSNotificationCenter (шаблон помогает 1 объекту связываться с объектами один-ко-многим)

2) Используйте шаблон многоадресного делегата. Детали реализации вы можете найти здесь http://blog.scottlogic.com/2012/11/19/a-multicast-delegate-pattern-for-ios-controls.html

3) Используйте шаблон проектирования Proxy. (Этот путь я выбрал)

class MyTextView.h

@protocol NJCustomTextViewDelegate <NSObject>

- textViewShouldBeginEditing:
- textViewDidBeginEditing:
- textViewShouldEndEditing:
- textViewDidEndEditing:

@end

@property (nonatomic, weak) id< NJCustomTextViewDelegate >textViewDelegate;

Использовать это:

in MyTextView.m

self.delegate = self;

-  (void)textViewShouldBeginEditing:(UITextView)textView
{
    // Handle business logi
    // .... Do your logic here

    if ([self.textViewDelegate responseToSelector:@selector(textViewShouldBeginEditing:)])
    {
        [self.textViewDelegate textViewShouldBeginEditing:self];
    }
}

In MyViewController.m

MyTextView textView = ....
textView.textViewDelegate = self;
person Proton    schedule 04.07.2016