2010-05-22 12 views
28

Powiedzmy, że mam IBAction, która jest podłączona do UIButton w konstruktorze interfejsów.Jaki jest najlepszy sposób wywoływania IBAction od wpisania kodu?

- (IBAction)functionToBeCalled:(id)sender 
{ 
    // do something here 

} 

Z-w moim kodu, powiedzmy na przykład w inny sposób, co jest najlepszym sposobem, aby wybrać ten IBAction?

Gdy próbuję to nazwać tak, otrzymuję błąd:

[self functionToBeCalled:]; 

Ale gdy próbuję to nazwać tak (oszukiwanie trochę, myślę), to działa dobrze:

[self functionToBeCalled:0]; 

Jaki jest właściwy sposób, aby nazwać to poprawnie?

Odpowiedz

66

Właściwym sposobem jest:

- [self functionToBeCalled:nil] 

Aby zdać nil nadawcę, co wskazuje, że nie został powołany przez zwykłe ramy.

LUB

- [self functionToBeCalled:self] 

Aby zdać sobie jako nadawca, który jest również poprawna.

Który z nich wybrać zależy od tego, co dokładnie robi funkcja i czego oczekuje od nadawcy.

+0

idealne, dziękuję! – iwasrobbed

+0

A co z przekazywaniem [tagu nadawcy] również przez programowanie? – Andy

+1

@Andy, możesz przekazać w dowolnej podklasie NSView do tych metod. Właściwie, możesz przekazać dowolny NSObject w ogóle! (id) Jest typem ogólnym, który może pomieścić dowolny parametr. Tylko pamiętaj, aby wysłać to, co IBAction spodziewa się otrzymać (zazwyczaj podklasa NSView). –

6

IMO wywołanie IBAction powinno być wyzwalane tylko przez akcje interfejsu użytkownika (np. Dotknięcie przycisku). Jeśli potrzebne do uruchomienia kodu z wielu miejsc, można wyodrębnić ten kod z IBAction do nowej metody i wywołanie tej metody z obu miejscach

- (IBAction)onButtonTap:(id)sender 
{ 
    [self doSomething]; 
} 

ta pozwala na wykonywanie dodatkowej logiki na podstawie nadawcy (Być może możesz przypisać tę samą akcję do wielu przycisków i zdecydować, co zrobić na podstawie parametru sender). Zmniejsza to również ilość kodu, który musisz zapisać w IBAction (dzięki czemu twoja implementacja kontrolera jest czysta).

Powiązane problemy