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