Добавить свое собственное событие в «Отправленные события» в меню Interface Builder для моего собственного пользовательского UIView - PullRequest
11 голосов
/ 26 апреля 2011

Я создал подкласс UIView, и я хотел бы, чтобы он публиковал пользовательские события, которые отображаются в Интерфейсном Разработчике (фактически Xcode4) так же, как элементы управления, такие как UIButton, имеют кучу событий в области «Отправленные события», когда Вы щелкаете правой кнопкой мыши элемент управления в конструкторе Xcode 4. Я знаю, что могу использовать Делегирование (через протоколы) или Уведомление (через UINotificationCenter), чтобы позволить объектам, использующим мое настраиваемое представление, знать, когда происходят определенные вещи, но я хотел бы знать, существует ли «Механизм целевого действия» (описанный в Руководство по основам какао) уместно / желательно / возможно использовать и интегрировать с дизайнером Xcode. Этот подход, по большей части основанный на .NET, кажется, тесно связан с моделью событий .NET и имеет для меня наибольшее значение.

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

Есть UIControlEventApplicationReserved , который предоставляет вам диапазон идентификаторов событий, которые может использовать ваше приложение.Однако я не думаю, что есть какой-либо способ сообщить Interface Builder о событиях, определяемых приложением, поэтому вы не получите такую ​​же поддержку для ваших событий в IB, как для стандартных событий UIControl.Вместо этого вам нужно будет указать цель и действие для каждого определенного приложением события в коде.(Пожалуйста, кто-нибудь поправит меня, если я ошибаюсь в этом вопросе.) Это совсем не сложно, но немного по-другому.

3 голосов
/ 08 февраля 2012

Простой способ сделать это - расширить UIControl вместо UIView, что позволит вам добавить цель ко всем событиям по умолчанию (так же, как UIButton и т. Д.).

Примечание:чтобы мой пользовательский UIControl мог обрабатывать события в отличие от элементов управления, которые я наложил поверх него, я должен был убедиться, что userInteractionEnabled = NO был установлен на всех многоуровневых элементах управления.

1 голос
/ 09 ноября 2013

Вы можете сделать это, используя IBOutletCollection. Преимущество этого подхода заключается в том, что вы можете связывать объекты в Интерфейсном Разработчике. Недостатком является то, что вы не можете напрямую ссылаться на IBActions (например, UIControl). Вот чистая реализация с использованием протокола:

ObserverProtocol.h

@protocol ObserverProtocol <NSObject>
- (void)observedObjectChanged:(id)sender;
@end

myobject.h

@interface MyObject : NSObject
{
@private
    IBOutletCollection(id<ObserverProtocol>) NSArray *observers;
}
- (void)objectChanged;

MyObject.m

@implementation MyObject

- (void)objectChanged
{
    for (id<ObserverProtocol> observer in observers)
    {
        if ([observer respondsToSelector:@selector(observedObjectChanged:)])
        {
            [observer observedObjectChanged:self];
        }
    }
}

@end

Тогда вам просто нужно реализовать ObserverProtocol в классах, которые вы хотите наблюдать за событием (и, конечно, выполнить связывание в Интерфейсном Разработчике).

...