IBOutlet dan IBAction

159

Apa tujuan menggunakan IBOutlets dan IBActions di Xcode dan Interface Builder?

Apakah ada bedanya jika saya tidak menggunakan IBOutlets dan IBActions?


Cepat:

@IBOutlet weak var textField: UITextField!

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

Tujuan-C:

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

- (IBAction)buttonPressed:(id)sender { /* ... */ }
suse
sumber
12
Semua jawaban menyebutkan jenis ide yang sama .. tetapi tidak ada yang menjelaskan mengapa Interface Builder tampaknya berfungsi sama jika Anda TIDAK menyertakan IBAction / IBOutlet di sumber Anda. Apakah ada alasan lain untuk IBAction dan IBOutlet atau apakah saya boleh meninggalkannya ?
bobobobo
2
Jawaban Michael Rogers di bawah ini menambahkan sedikit penjelasan tentang mengapa kode ini bekerja bahkan ketika IBAction ditinggalkan.
Krishna
IBActions ada sebagai bagian dari mekanisme interaksi aksi-target, Anda dapat membaca tentang bagaimana IBAction cocok dengan yang ada di sini: developer.apple.com/library/ios/documentation/General/… Anda dapat membaca di Outlet di sini: developer.apple. com / library / ios / dokumentasi / Umum / ...
William Power

Jawaban:

208

IBActiondan IBOutletmakro didefinisikan untuk menunjukkan variabel dan metode yang dapat disebut dalam Interface Builder.

IBActionmemutuskan untuk voiddan IBOutletmemutuskan untuk tidak melakukan apa pun, tetapi mereka menandakan ke Xcode dan pembuat antarmuka bahwa variabel dan metode ini dapat digunakan dalam pembuat antarmuka untuk menghubungkan elemen UI ke kode Anda.

Jika Anda tidak akan menggunakan Interface Builder sama sekali, maka Anda tidak memerlukannya dalam kode Anda, tetapi jika Anda akan menggunakannya, maka Anda perlu menentukan IBActionmetode yang akan digunakan dalam IB dan IBOutletuntuk objek yang akan digunakan di IB.

Jasarien
sumber
@Jasarien "Anda perlu menentukan IBAction untuk metode yang akan digunakan dalam IB dan IBOutlet untuk objek yang akan digunakan dalam IB." Apa bedanya ?
cyrilchampier
3
@nerith Perbedaan yang sama yang ada antara metode dan objek. IBAksi untuk metode, IBOutlet untuk objek.
Jasarien
Hanya untuk mengklarifikasi, karena posting saya diedit, IBOutlettidak menyelesaikan id. Pertimbangkan ini: IBOutlet UILabel *nameLabel;- jika IBOutletdiselesaikan id, maka kode itu akan membaca id UIlabel *namelabel;yang menghasilkan kesalahan kompiler. Seperti yang saya nyatakan pada awalnya, IBOutlettidak ada keputusan.
Jasarien
38

Cara tradisional untuk menandai metode sehingga akan muncul di Interface Builder, dan Anda dapat menyeret koneksi ke sana, telah membuat metode pengembalian jenis IBAction. Namun, jika Anda membuat metode Anda batal, sebagai gantinya (IBAction # define'd menjadi batal), dan memberikan argumen (id), metode ini masih terlihat. Ini memberikan fleksibilitas ekstra, al

Semua 3 ini terlihat dari Interface Builder:

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

Lihat Panduan Pengguna Pembuat Antarmuka Apple untuk detail, khususnya bagian yang berjudul Xcode Integration.

Michael Rogers
sumber
1
Berikut ini tautan ke panduan di atas yang disarankan: developer.apple.com/library/ios/recipes/…
Aggressor
32

Anda perlu menggunakan IBOutlet dan IBAction jika Anda menggunakan pembangun antarmuka (karenanya awalan IB) untuk komponen GUI Anda. IBOutlet diperlukan untuk mengaitkan properti dalam aplikasi Anda dengan komponen dalam IB, dan IBAction digunakan untuk memungkinkan metode Anda dikaitkan dengan tindakan dalam IB.

Misalnya, Anda mendefinisikan tombol dan label di IB. Untuk secara dinamis mengubah nilai label dengan menekan tombol, Anda akan menentukan tindakan dan properti di aplikasi Anda yang mirip dengan:

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

Kemudian di IB Anda akan menghubungkan myLabel dengan label dan menghubungkan metode pushme dengan tombol. Anda membutuhkan IBAction dan IBOutlet agar koneksi ini ada di IB.

ennuikiller
sumber
13
tetapi mengapa masih berfungsi jika Anda tidak menyertakan label IBOutlet ..?
bobobobo
7
Karena makro ini tidak melakukan apa pun pada waktu kompilasi, mereka hanya jadi aplikasi build Interface dapat menemukan metode-metode dan file-file builder antarmuka dalam kode sumber sehingga Anda dapat menyeret antara pembuat antarmuka dan kode Anda, satu koneksi yang dibuat tidak penting lagi.
Nathan Day
IBAction tidak melakukan apa pun pada waktu edit, setidaknya selama satu dekade terakhir. Anda dapat menghubungkan (void)metode di Interface Builder juga.
J. Cocoe
7

Interface Builder menggunakannya untuk menentukan anggota dan pesan apa yang dapat 'dihubungkan' ke kontrol antarmuka yang Anda gunakan di jendela / tampilan Anda.

IBOutlet dan IBAction murni ada di sana sebagai penanda yang dicari oleh Interface Builder ketika mem-parsing kode Anda pada waktu desain, mereka tidak memiliki pengaruh pada kode yang dihasilkan oleh kompiler.

KazR
sumber
7

Berlari ke dalam diagram sambil melihat kode kunci-nilai, berpikir itu mungkin membantu seseorang. Ini membantu dengan pemahaman tentang apa itu IBOutlet.

Dengan melihat alurnya, orang dapat melihat bahwa IBOutlets hanya ada di sana untuk mencocokkan nama properti dengan nama kontrol di file Nib.

Bagaimana file nib dimuat, tangkapan layar buku online Matt untuk iOS6

NSCoder
sumber
Jawaban ini menjelaskan mengapa dan bagaimana IBOutlets bekerja, bukan hanya apa yang mereka lakukan .
Jeffery Opoku-Mensah
4

Outlet adalah tautan dari kode ke UI. Jika Anda ingin menampilkan atau menyembunyikan elemen UI, jika Anda ingin mendapatkan teks dari bidang teks atau mengaktifkan atau menonaktifkan elemen (atau seratus hal lainnya) Anda harus mendefinisikan outlet dari objek itu di sumber dan menautkan outlet itu melalui "objek antarmuka" ke elemen UI. Setelah itu Anda bisa menggunakan outlet sama seperti variabel lain dalam pengkodean Anda.

IBAction - metode khusus yang dipicu oleh objek antarmuka pengguna. Interface Builder mengenali mereka.

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

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

Untuk informasi lebih lanjut, lihat Apple Documents

पवन
sumber
Uhm, tidak, bukan itu IBOutlet. Dari mana Anda mendapatkan ide itu?
Richard J. Ross III
3

IBAction dan IBOutlets digunakan untuk menghubungkan antarmuka Anda yang dibuat di Interface Builder dengan pengontrol Anda. Jika Anda tidak akan menggunakan Interface Builder dan membuat antarmuka Anda sepenuhnya dalam kode, Anda bisa membuat program tanpa menggunakannya. Namun pada kenyataannya sebagian besar dari kita menggunakan Interface Builder, setelah Anda ingin mendapatkan interaktivitas di antarmuka Anda, Anda harus menggunakan IBActions dan IBoutlets.

Yannick Compernol
sumber
2

IBOutlet

  • Itu adalah properti .
  • Ketika file nib (IB) dimuat, itu menjadi bagian dari data yang dienkapsulasi yang terhubung ke variabel instan.
  • Setiap koneksi tidak diarsipkan dan dibangun kembali.

IBAction

  • Atribut menunjukkan bahwa metode ini adalah tindakan yang dapat Anda sambungkan dari storyboard Anda di Interface Builder.

@ - IB pola Dinamis - Pembuat Antarmuka

Vinoth Anandan
sumber
2

Salah satu komentar teratas pada Pertanyaan ini secara khusus menanyakan:

Semua jawaban menyebutkan jenis ide yang sama .. tetapi tidak ada yang menjelaskan mengapa Interface Builder tampaknya berfungsi sama jika Anda TIDAK menyertakan IBAction / IBOutlet di sumber Anda. Apakah ada alasan lain untuk IBAction dan IBOutlet atau apakah saya boleh meninggalkannya?


Pertanyaan ini dijawab dengan baik oleh NSHipster:

IBAction

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

Pada awal 2004 (dan mungkin sebelumnya), IBAction tidak lagi diperlukan untuk metode yang diperhatikan oleh Interface Builder. Metode apa pun dengan tanda tangan -(void){name}:(id)senderakan terlihat di panel outlet.

Namun demikian, banyak pengembang merasa berguna untuk tetap menggunakan tipe pengembalian IBAction dalam deklarasi metode untuk menyatakan bahwa metode tertentu terhubung dengan suatu tindakan. Bahkan proyek yang tidak menggunakan Storyboards / XIB dapat memilih untuk menggunakan IBAction untuk memanggil metode target / aksi.

IBOutlet:

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

Tidak seperti IBAction, IBOutlet masih diperlukan untuk menghubungkan properti dalam kode dengan objek di Storyboard atau XIB.

Koneksi IBOutlet biasanya dibuat antara tampilan atau kontrol dan pengontrol tampilan pengelolanya (ini sering dilakukan sebagai tambahan terhadap setiap IBAksi yang mana pengontrol tampilan mungkin ditargetkan untuk dijalankan oleh responden). Namun, IBOutlet juga dapat digunakan untuk mengekspos properti tingkat atas, seperti pengontrol lain atau properti yang kemudian dapat diakses oleh pengontrol tampilan referensi.

pkamb
sumber
1

ketika Anda menggunakan Interface Builder, Anda dapat menggunakan Inspektur Koneksi untuk mengatur acara dengan penangan acara, penangan acara seharusnya fungsi yang memiliki pengubah IBAction. Tampilan dapat dihubungkan dengan referensi untuk tipe yang sama dan dengan pengubah IBOutlet.

Angin barat
sumber