2009-05-25 25 views
6

Jaki jest najlepszy sposób rejestrowania zdarzeń dla mojej podklasy UIView, aby móc połączyć je z IBAction-ami w konstruktorze interfejsów?Zdarzenia niestandardowe UIView

Obecnie właśnie dostałem standardowy UIView, który spadł na mój główny widok i ustawiłem klasę na "RadioDial" (moja klasa niestandardowa). Wyświetla to dobrze, ale nie mam pojęcia, jak wydobyć z niego zdarzenia.

Dzięki

Odpowiedz

5

Proszę wyjaśnić: czy masz na myśli, że chciałbyś, aby Interface Builder oferował twoim kontrolerom widoków wiązanie się z niestandardowymi zdarzeniami, które będą emitować podklasy widoków (podobnie jak przyciski sterujące pozwalają na podłączenie Touch Inside, itp.)?

Jeśli potrzebujesz tego typu funkcji, musisz użyć ogólnej właściwości "delegata" w swoim widoku w połączeniu z protokołem.

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

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

To pozwoli regulator do drutu do widzenia (przy założeniu, że realizuje RadioDialDelegate) i odbierać żadnych zdarzeń, które pochodzą z widoku. Możesz też użyć delegata bez nazwy, a w kodzie widoku użyć połączenia z opóźnieniem:

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

Tak, właśnie o to mi chodzi. A problem, który mam, polega na tworzeniu niestandardowych zdarzeń dla mojej podklasy widoku. To, co się naprawdę dzieje, to to, że na zajęciach - (void) dotyka Moved pod pewnymi warunkami, chciałbym wystrzelić i wydarzenie i chciałbym, aby to wydarzenie było możliwe do połączenia z IBActions przez IB. –

+0

Edytowałem swoją odpowiedź, aby odzwierciedlić, jak to zrobić. Aby to zrobić, musisz użyć wzorca delegata/protokołu. IB wystawi pełnomocnika jako właściwość, która jest przypisana do kontrolera (musisz również odpowiednio ustawić klasę kontrolera w IB), a kontroler będzie musiał wdrożyć protokół. – Jason

+0

Ten rodzaj ma sens (całkiem nowy w całym Objective-C/Cocoa), ale w jaki sposób pozwoliłoby to na powiązanie każdego zdarzenia zmiany wartości RadioDial-s z inną metodą na kontrolerze widoku? Rozumiem, że mogę używać tej samej metody i sprawdzać referencje nadawcy, ale czy to jedyny sposób? –

3

Tworzenie metody w kontrolerze widzenia (jeśli nic innego, trzeba mieć RootViewController w projekcji). Załóżmy, że metoda jest

-(void) buttonClicked { code code code } 

W pliku nagłówkowym kontrolera (np RootViewController.h) następnie umieścić:

-(IBAction) buttonClicked; 

A IB kliknięciu prawym przyciskiem myszy pokrętło/przycisk radiowy/cokolwiek. Zobaczysz listę zdarzeń i możesz przeciągnąć ze złącza zdarzenia, które ma otrzymać twój kontroler, do obiektu w IB, który reprezentuje kontroler (prawdopodobnie First Responder). To zależy od konfiguracji twojej struktury IB, ale powinno być proste.

Kolejną alternatywą jest programowanie programowania UIViews i na razie zapomnienie o IB. Opinie są podzielone na temat tego, czy lepiej jest nauczyć się korzystać z IB na początku, czy lepiej nauczyć się robić wszystko w kodzie i zapisać IB na później. W każdym razie konieczne jest poznanie obu sposobów konfigurowania interfejsu w pewnym momencie.

Powiązane problemy