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

Добавьте мое собственное событие в "Отправленные события" в меню Interface Builder для моего собственного UIView

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Вы можете сделать это, используя IBOutletCollection. Преимущество этого подхода заключается в том, что вы можете связывать объекты в Interface Builder. Недостатком является то, что вы не можете напрямую ссылаться на 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 в классах, которые вы хотите наблюдать за событием (и, конечно же, выполнять привязку в Interface Builder).