IBOutlet ve IBAction


159

Xcode ve Interface Builder'da IBOutlet'leri ve IBActions'ı kullanmanın amacı nedir?

IBOutlet'leri ve IBActions'ı kullanmazsam herhangi bir fark yaratır mı?


Swift:

@IBOutlet weak var textField: UITextField!

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

Objective-C:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
Tüm cevaplar aynı fikirden bahsediyor .. ama kimse kaynağınıza IBAction / IBOutlet'i İÇERMİYORSANIZ neden Interface Builder'ın aynı şekilde çalıştığını açıklamıyor. IBAction ve IBOutlet için başka bir neden var mı veya onları bırakmak uygun mudur?
bobobobo

2
Michael Rogers'ın aşağıdaki cevabı, IBAction dışında bırakıldığında bile kodun neden çalıştığına dair biraz açıklama ekliyor.
Krishna

IBActions hedef aksiyon etkileşim mekanizmasının bir parçası olarak var, sen IBAction burada o yeri hakkında bilgi edinebilirsiniz: developer.apple.com/library/ios/documentation/General/... Burada çıkışta kadar okuyabilir: developer.apple. com / kütüphane / ios / belgeler / Genel /…
William Power

Yanıtlar:


208

IBActionve IBOutletArayüz Oluşturucu'da atıfta bulunulan değişkenleri ve yöntemleri göstermek için tanımlanan makrolardır.

IBActionkarar verir voidveIBOutlet hiçbir şey çözer, ancak bu değişkenler ve yöntemlerin Xcode ve Interface oluşturucu delalet Kodunuza bağlantı arayüzü öğeleri için Arayüz Oluşturucu kullanılabilir.

Interface Builder'ı hiç kullanmayacaksanız, kodunuzda bunlara ihtiyacınız yoktur, ancak kullanacaksanız, IBActionIB'de ve IBOutletnesnelerde kullanılacak yöntemler için belirtmeniz gerekir. IB'de kullanılacak.


@Jasarien "IB'de kullanılacak yöntemler için IBAction'ı ve IB'de kullanılacak nesneler için IBOutlet'i belirtmeniz gerekiyor." Fark ne ?
cyrilchampier

3
@nerith Yöntemler ve nesneler arasındaki fark. Yöntemler için IBActions, nesneler için IBOutlet.
Jasarien

Benim yayın düzenlendi beri Sadece netleştirmek için, IBOutlethiç çözmez id. Şunu düşünün: IBOutlet UILabel *nameLabel;- IBOutletçözümlenirse id, id UIlabel *namelabel;derleyici hatası üreten kod okunur . Başlangıçta belirttiğim gibi, IBOutlethiçbir şeye karar vermez.
Jasarien

38

Arabirim Oluşturucu'da görünmesi ve bir bağlantıyı sürükleyebilmeniz için bir yöntemi işaretlemenin geleneksel yolu, yöntemin IBAction türünü döndürmesini sağlamaktır. Ancak, yönteminizi geçersiz kılarsanız, bunun yerine (IBAction # geçersiz olması için tanımlanır) ve bir (id) argümanı sağlarsanız, yöntem hala görünür olur. Bu ekstra esneklik sağlar.

Bunların 3'ü de Arayüz Oluşturucu'dan görülebilir:

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

Ayrıntılar için Apple'ın Interface Builder Kullanıcı Kılavuzu'na, özellikle Xcode Entegrasyonu başlıklı bölüme bakın.


1
Önerilen yukarıdaki rehbere bir link aşağıda verilmiştir: developer.apple.com/library/ios/recipes/…
Aggressor

32

GUI bileşenleriniz için arabirim oluşturucu (dolayısıyla IB öneki) kullanıyorsanız IBOutlet ve IBAction'ı kullanmanız gerekir. Uygulamanızdaki özellikleri IB'deki bileşenlerle ilişkilendirmek için IBOutlet gerekir ve yöntemlerinizin IB'deki eylemlerle ilişkilendirilmesine izin vermek için IBAction kullanılır.

Örneğin, IB'de bir düğme ve etiket tanımladığınızı varsayalım. Düğmeye basarak etiketin değerini dinamik olarak değiştirmek için uygulamanızda aşağıdakine benzer bir işlem ve özellik tanımlayacaksınız:

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

Daha sonra IB'de myLabel'i etikete bağlarsınız ve pushme yöntemini düğmeyle bağlarsınız. Bu bağlantıların IB'de olması için IBAction ve IBOutlet'e ihtiyacınız vardır.


13
ama neden IBOutlet etiketini eklemezseniz işe yarıyor ?
bobobobo

7
Bu makrolar derleme zamanında hiçbir şey yapmadığından, arayüz oluşturma uygulaması bu yöntemleri ve arayüz oluşturucu dosyalarını kaynak kodunda bulabilir, böylece arayüz oluşturucu ve kodunuz arasında sürükleyebilirsiniz, bir bağlantı yapılmaz artık önemli değil.
Nathan Day

IBAction en azından son on yıldır düzenleme zamanında hiçbir şey yapmıyor. (void)Interface Builder'da da bir yöntem bağlayabilirsiniz .
J. Cocoe

7

Arabirim Oluşturucu, pencerenizde / görünümünüzde kullandığınız arabirim denetimlerine kadar hangi üyelerin ve iletilerin 'bağlanabileceğini' belirlemek için bunları kullanır.

IBOutlet ve IBAction, yalnızca Interface Builder'ın kodunuzu tasarım zamanında ayrıştırdığında aradığı işaretçiler olarak bulunur, derleyici tarafından üretilen kod üzerinde herhangi bir etkisi yoktur.


7

Anahtar / değer kodlamasına bakarken şemaya koştum, birinin yardımcı olabileceğini düşündüm. IBOutlet'in ne olduğunu anlamaya yardımcı olur.

Akışı inceleyerek, IBOutlet'lerin özellik adını Nib dosyasındaki bir kontrol adıyla eşleştirmek için orada olduklarını görebilirsiniz.

Nib dosyası nasıl yüklenir, Matt'in iOS6 için çevrimiçi kitabının ekran görüntüsü


Bu cevap, IBOutlet'lerin sadece yaptıkları değil neden ve nasıl çalıştığını açıklamaktadır .
Jeffery Opoku-Mensah

4

Outlet, koddan kullanıcı arayüzüne bir bağlantıdır. Bir kullanıcı arabirimi öğesini göstermek veya gizlemek istiyorsanız, bir metin alanının metnini almak veya bir öğeyi (veya başka yüz şeyi) etkinleştirmek veya devre dışı bırakmak istiyorsanız, kaynaklarda o nesnenin bir çıkışını tanımlamanız ve bu çıkışa bağlamanız gerekir. “arayüz nesnesi” üzerinden UI öğesine. Bundan sonra, çıkışı kodunuzdaki diğer değişkenler gibi kullanabilirsiniz.

IBAction - kullanıcı arabirimi nesneleri tarafından tetiklenen özel bir yöntem. Interface Builder bunları tanır.

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

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

Daha fazla bilgi için lütfen Apple Dokümanlarına bakın


Uhm, hayır, bir IBOutlet böyle değil. Bu fikri nereden edindin?
Richard J.Ross III

3

IBAction ve IBOutlets, Interface Builder'da yapılan arabiriminizi denetleyicinizle bağlamak için kullanılır. Interface Builder'ı kullanmazsanız ve arayüzünüzü tamamen kod içinde oluşturmazsanız, bunları kullanmadan bir program yapabilirsiniz. Ancak gerçekte çoğumuz Interface Builder'ı kullanıyoruz, arayüzünüzde biraz etkileşimin olmasını istiyorsanız, IBActions ve IBoutlets'i kullanmanız gerekecek.


2

IBOutlet

  • Bir özelliktir .
  • Uç (IB) dosyası yüklendiğinde, bir örnek değişkenine bağlanan kapsüllenmiş verilerin bir parçası haline gelir.
  • Her bağlantı arşivden çıkarılır ve yeniden kurulur.

IBAction

  • Özellik , yöntemin Arayüz Oluşturucu'daki film şeridinizden bağlanabileceğiniz bir eylem olduğunu belirtir.

@ - Dinamik desen IB - Arayüz Oluşturucu


2

Bu sorunun en iyi yorumlarından biri özellikle şunu soruyor:

Tüm cevaplar aynı fikirden bahsediyor .. ama kimse kaynağınıza IBAction / IBOutlet'i İÇERMİYORSANIZ neden Interface Builder'ın aynı şekilde çalıştığını açıklamıyor. IBAction ve IBOutlet için başka bir neden var mı veya onları bırakmak uygun mudur?


Bu soru NSHipster tarafından iyi cevaplanmıştır:

IBAction

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

2004'ün başlarında (ve belki de daha önce), bir yöntemin Arayüz Oluşturucu tarafından fark edilmesi için artık IBAction gerekli değildi . İmzaya sahip herhangi bir yöntem -(void){name}:(id)sender, çıkışlar bölmesinde görülebilir.

Bununla birlikte, birçok geliştirici, belirli bir yöntemin bir eylemle bağlandığını belirtmek için yöntem bildirimlerinde IBAction dönüş türünü kullanmaya devam etmeyi yararlı bulmaktadır. Storyboard'ları / XIB'leri kullanmayan projeler bile hedef / eylem yöntemlerini çağırmak için IBAction kullanmayı seçebilir.

IBOutlet:

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

IBAction'ın aksine, IBOutlet, bir Storyboard veya XIB'deki nesnelerle koddaki özellikleri bağlamak için hala gereklidir .

IBOutlet bağlantısı genellikle bir görünüm veya denetim ile yönetim görünümü denetleyicisi arasında kurulur (bu genellikle bir görünüm denetleyicisinin bir yanıtlayıcı tarafından gerçekleştirmeyi hedefleyebileceği tüm IBActions'a ek olarak yapılır). Bununla birlikte, başka bir denetleyici veya daha sonra bir başvuru görüntüleme denetleyicisi tarafından erişilebilen bir özellik gibi bir üst düzey özelliği göstermek için bir IBOutlet de kullanılabilir.


1

Interface Builder'ı kullandığınızda, olay işleyicileriyle olayları ayarlamak için Connections Inspector'ı kullanabilirsiniz; olay işleyicilerinin IBAction değiştiricisine sahip işlevler olması gerekir. Bir görünüm, aynı tip referansı ve IBOutlet değiştiricisiyle bağlanabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.