IBOutlet i IBAction

159

Jaki jest cel korzystania z IBOutlets i IBActions w Xcode i Interface Builder?

Czy to ma znaczenie, jeśli nie korzystam z IBOutlets i IBActions?


Szybki:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

Cel C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
źródło
12
Wszystkie odpowiedzi wspominają o tym samym typie pomysłu ... ale nikt nie wyjaśnia, dlaczego Interface Builder wydaje się działać tak samo, jeśli NIE włączysz IBAction / IBOutlet w swoim źródle. Czy istnieje inny powód dla IBAction i IBOutlet, czy też można je zostawić ?
bobobobo
2
Poniższa odpowiedź Michaela Rogersa dodaje nieco wyjaśnienia, dlaczego kod działa, nawet jeśli pominięto IBAction.
Krishna
IBActions istnieją jako część mechanizmu interakcji target-action. O tym, jak IBAction pasuje do tego, można przeczytać tutaj: developer.apple.com/library/ios/documentation/General/ ... Możesz przeczytać o Outlets tutaj: developer.apple. com / library / ios / documents / General /…
William Power

Odpowiedzi:

208

IBActioni IBOutletsą makrami zdefiniowanymi w celu oznaczenia zmiennych i metod, do których można się odwoływać w programie Interface Builder.

IBActionrozwiązuje voidi IBOutletrozwiązuje jako nic, ale oznacza dla Xcode i konstruktora interfejsu, że te zmienne i metody mogą być używane w programie do tworzenia interfejsów do łączenia elementów interfejsu użytkownika z kodem.

Jeśli w ogóle nie będziesz używać Interface Builder, to nie potrzebujesz ich w swoim kodzie, ale jeśli masz zamiar go używać, musisz określić IBActionmetody, które będą używane w IB i IBOutletdla obiektów które zostaną użyte w IB.

Jasarien
źródło
@Jasarien "musisz określić IBAction dla metod, które będą używane w IB i IBOutlet dla obiektów, które będą używane w IB." Co za różnica ?
cyrilchampier
3
@nerith Ta sama różnica, jaka istnieje między metodami i obiektami. IBActions dla metod, IBOutlet dla obiektów.
Jasarien
Dla wyjaśnienia, ponieważ mój post był edytowany, IBOutletnie rozwiązuje się id. Rozważ to: IBOutlet UILabel *nameLabel;- jeśli zostanie IBOutletrozwiązane na id, to ten kod będzie czytać, id UIlabel *namelabel;co spowoduje błąd kompilatora. Jak pierwotnie stwierdziłem, nie IBOutletrozwiązuje problemu.
Jasarien
38

Tradycyjnym sposobem oznaczania metody, aby pojawiła się w Interface Builder i można było przeciągnąć do niej połączenie, jest zwrócenie metody IBAction. Jednakże, jeśli zamiast tego ustawisz metodę jako void (IBAction jest # zdefiniowana jako void) i podasz argument (id), metoda będzie nadal widoczna. Zapewnia to dodatkową elastyczność, al

Wszystkie 3 z nich są widoczne w Interface Builder:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender;

Szczegółowe informacje można znaleźć w podręczniku użytkownika Interface Builder firmy Apple, w szczególności w sekcji zatytułowanej Integracja z Xcode.

Michael Rogers
źródło
1
Oto link do sugerowanego powyżej przewodnika: developer.apple.com/library/ios/recipes/…
Aggressor
32

Musisz użyć IBOutlet i IBAction, jeśli używasz konstruktora interfejsu (stąd prefiks IB) dla komponentów GUI. IBOutlet jest potrzebny do kojarzenia właściwości w aplikacji z komponentami w IB, a IBAction służy do umożliwienia skojarzenia metod z akcjami w IB.

Na przykład załóżmy, że definiujesz przycisk i etykietę w IB. Aby dynamicznie zmieniać wartość etykiety poprzez naciśnięcie przycisku, zdefiniujesz akcję i właściwość w swojej aplikacji, podobnie jak:

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

Następnie w IB należy połączyć myLabel z etykietą i połączyć metodę pushme z przyciskiem. Potrzebujesz IBAction i IBOutlet, aby te połączenia istniały w IB.

ennuikiller
źródło
13
ale dlaczego to nadal działa, jeśli nie uwzględnisz etykiet IBOutlet ..?
bobobobo
7
Ponieważ te makra nie robią nic w czasie kompilacji, są po prostu po to, aby aplikacja do tworzenia interfejsu mogła znaleźć te metody i pliki konstruktora interfejsu w kodzie źródłowym, dzięki czemu można przeciągać między konstruktorem interfejsu a kodem, w przypadku gdy połączenie nie jest tworzone mają już znaczenie.
Dzień Nathana
IBAction też nic nie robi w czasie edycji, przynajmniej przez ostatnią dekadę. Możesz również podłączyć (void)metodę w Interface Builder.
J. Cocoe
7

Interface Builder używa ich do określenia, które elementy i wiadomości mogą być „połączone” z kontrolkami interfejsu, których używasz w swoim oknie / widoku.

IBOutlet i IBAction są wyłącznie znacznikami, których szuka Interface Builder podczas analizowania kodu w czasie projektowania, nie mają one żadnego wpływu na kod generowany przez kompilator.

KazR
źródło
7

Wpadłem na diagram, patrząc na kodowanie klucz-wartość, pomyślałem, że może to komuś pomóc. Pomaga zrozumieć, czym jest IBOutlet.

Patrząc na przepływ, można było zobaczyć, że IBOutlety istnieją tylko po to, aby dopasować nazwę właściwości do nazwy kontrolki w pliku Nib.

Sposób ładowania pliku nib, zrzut ekranu książki online Matta na iOS6

NSCoder
źródło
Ta odpowiedź wyjaśnia, dlaczego i jak działają IBOutlety, a nie tylko to, co robią .
Jeffery Opoku-Mensah
4

Outlet to łącze z kodu do interfejsu użytkownika. Jeśli chcesz pokazać lub ukryć element UI, jeśli chcesz uzyskać tekst pola tekstowego lub włączyć lub wyłączyć element (lub sto innych rzeczy), musisz zdefiniować wyjście tego obiektu w źródłach i połączyć to gniazdo przez „obiekt interfejsu” do elementu UI. Następnie możesz używać gniazdka tak samo, jak każdej innej zmiennej w swoim kodowaniu.

IBAction - specjalna metoda wyzwalana przez obiekty interfejsu użytkownika. Interface Builder rozpoznaje je.

@interface Controller
{
  IBOutlet id textField; // links to TextField UI object
}

- (IBAction)doAction:(id)sender; // e.g. called when button pushed

Więcej informacji można znaleźć w Dokumentach Apple

पवन
źródło
Uhm, nie, to nie jest IBOutlet. Skąd masz ten pomysł?
Richard J. Ross III
3

IBAction i IBOutlets służą do połączenia interfejsu utworzonego w Interface Builder z kontrolerem. Jeśli nie używałbyś Interface Builder i nie zbudowałbyś swojego interfejsu całkowicie w kodzie, mógłbyś stworzyć program bez ich używania. Ale w rzeczywistości większość z nas korzysta z Interface Builder, jeśli chcesz uzyskać interaktywność w swoim interfejsie, będziesz musiał użyć IBActions i IBoutlets.

Yannick Compernol
źródło
2

IBOutlet

  • To jest własność .
  • Po załadowaniu pliku nib (IB) staje się on częścią zhermetyzowanych danych, które łączą się ze zmienną instancji.
  • Każde połączenie jest przywracane z archiwum i przywracane.

IBAction

  • Atrybut wskazuje, że metoda jest akcją, z którą można się połączyć ze swojej serii ujęć w programie Interface Builder.

@ - Wzorzec dynamiczny IB - Interface Builder

Vinoth Anandan
źródło
2

Jeden z najpopularniejszych komentarzy na to pytanie dotyczy konkretnie:

Wszystkie odpowiedzi wspominają o tym samym typie pomysłu ... ale nikt nie wyjaśnia, dlaczego Interface Builder wydaje się działać tak samo, jeśli NIE włączysz IBAction / IBOutlet w swoim źródle. Czy istnieje inny powód dla IBAction i IBOutlet, czy też można je zostawić?


Na to pytanie dobrze odpowiada NSHipster:

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

Już w 2004 roku (a może wcześniej) IBAction nie było już konieczne, aby metoda została zauważona przez Interface Builder. Każda metoda z podpisem -(void){name}:(id)senderbyłaby widoczna w panelu gniazd.

Niemniej jednak wielu programistów uważa, że ​​przydatne jest nadal używanie zwracanego typu IBAction w deklaracjach metod, aby wskazać, że dana metoda jest połączona przez akcję. Nawet projekty, które nie używają scenorysów / XIB, mogą zdecydować się na użycie IBAction w celu określenia metod docelowych / działań.

IBOutlet:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

W przeciwieństwie do IBAction, IBOutlet jest nadal wymagany do łączenia właściwości w kodzie z obiektami w Storyboard lub XIB.

Połączenie IBOutlet jest zwykle ustanawiane między widokiem lub kontrolką a jej kontrolerem zarządzającym widokiem (jest to często wykonywane jako dodatek do wszelkich czynności IBActions, które kontroler widoku może wykonywać odpowiadający). Jednak IBOutlet może być również używany do uwidaczniania właściwości najwyższego poziomu, takiej jak inny kontroler lub właściwość, do której można uzyskać dostęp przez odwołujący się kontroler widoku.

pkamb
źródło
1

Kiedy używasz Interface Builder, możesz użyć Connections Inspector, aby skonfigurować zdarzenia z programami obsługi zdarzeń, procedury obsługi zdarzeń powinny być funkcjami, które mają modyfikator IBAction. Widok można połączyć z odwołaniem dla tego samego typu oraz z modyfikatorem IBOutlet.

Zefir
źródło