2009-05-25 6 views
6

Каков наилучший способ регистрации событий для моего подкласса UIView, чтобы я мог подключать их к IBAction-s в построителе интерфейса?События для пользовательского UIView

В настоящее время у меня только что установлен стандартный UIView на мой основной вид, и я установил класс в «RadioDial» (мой собственный класс). Это отображает прекрасный вид, но я понятия не имею, как извлечь из него события.

Благодаря

ответ

5

Просьба пояснить: имеете ли вы в виду, что вы хотели бы, чтобы Interface Builder предлагал вашим контроллерам представлений настраивать события, которые будет вызывать ваш подкласс вида (подобно элементам управления Button, вы можете подключить Touch Inside и т. Д.)?

Если вам нужен этот тип функциональности, вам нужно будет использовать обобщенное свойство «delegate» в вашем представлении в сочетании с протоколом.

@protocol RadioDialDelegate 
-(void)dialValueChanged:(id)sender 
@end 

@interface RadioDial 
{ 
    id<RadioDialDelegate> radioDelegate; 
} 
@property (nonatomic, assign) IBOutlet id<RadioDialDelegate> radioDelegate; 

Это позволит контроллеру подключить до представления (если он реализует RadioDialDelegate) и получать любые события, которые выходят из вида. В качестве альтернативы вы можете использовать нетипизированный делегат и в своем коде вида, используя поздний связанный звонок:

if([radioDelegate respondsToSelector:@selector(dialValueChanged:)]) { 
    [radioDelegate dialValueChanged:self]; 
} 
+0

Да, это именно то, что я имею в виду. И проблема, с которой я сталкиваюсь, заключается в создании этих настраиваемых событий для моего подкласса view. То, что на самом деле происходит, это то, что в классах (void) touchhesMoved при определенных условиях я хотел бы запустить и событие, и я хотел бы, чтобы это событие было подключаемо к IBActions через IB. – 2009-05-25 13:57:24

+0

Я отредактировал свой ответ, чтобы подумать, как это сделать. Для этого вам нужно будет использовать шаблон делегата/протокола. IB выведет делегата как свойство, назначенное вашему контроллеру (вам также необходимо правильно установить класс контроллера в IB), и ваш контроллер должен будет реализовать протокол. – Jason

+0

Этот тип имеет смысл (довольно новый для всей цели Objective-C/Cocoa), но как это позволит мне подключить каждое событие изменения значения RadioDial к другому методу на контроллере представления? Я понимаю, что могу использовать тот же метод и проверять ссылку на отправителя, но это единственный способ? – 2009-05-25 14:13:21

3

Создать метод в контроллере представления (если ничего другого, вы не должны иметь RootViewController в проецировании). Допустим, ваш метод

-(void) buttonClicked { code code code } 

В заголовочном файле контроллера (например RootViewController.h) вы затем положить:

-(IBAction) buttonClicked; 

И в ИБ вы щелкните правой кнопкой мыши кнопку/радио/диска независимо. Вы увидите список событий, и вы можете перетащить из соединителя события, который должен получить ваш контроллер, к объекту в IB, который представляет собой контроллер (возможно, первый ответчик). Это зависит от того, как настроена ваша структура IB, но она должна быть простой.

Другой альтернативой является научиться создавать UIViews программно и забывать об IB на данный момент. Мнения делятся на то, лучше ли научиться использовать IB с самого начала, или лучше узнать, как сделать все в коде и сохранить IB на потом. В любом случае необходимо изучить оба способа настройки интерфейса в какой-то момент.

Смежные вопросы