Untuk mengerti delegates
, Anda harus mengerti protocols
.
A protocol
seperti kontrak layanan. Ketika sebuah objek (paling sering UIViewController
subkelas, tetapi tidak selalu) menandatangani kontrak itu, dikatakan "Saya tertarik untuk memberikan logika untuk mendukung pesan yang Anda kirimkan kepada saya". Ini mirip dengan NSNotificationCenter
dalam hal mendaftar untuk tingkat minat, perbedaannya menjadi objek yang mempekerjakan delegasi hanya dapat memiliki satu delegate
pada satu waktu, di mana beberapa objek dapat mendaftar untuk hal yang sama NSNotification
.
Apple menggunakan pendelegasian secara luas. Namun, semakin banyak, Anda melihat Apple memindahkan banyak API mereka ke blocks
, yang serupa dengan callbacks
dalam bahasa lain.
Karena itu, delegasi membantu mempertahankan MVC, meskipun saya berpendapat delegasi adalah pola desain itu sendiri. Ini membantu untuk memisahkan model dari pengontrol. Seperti dalam contoh John Cartwright, yang UITableView
tahu cara menampilkan baris dan bagian. Ia tahu cara menggunakan kembali UITableViewCells
karena alasan kinerja. Ia tahu semua hal lain yang UIScrollView
diketahui. Tetapi tidak tahu sel mana yang akan ditampilkan. Ia tidak tahu apa yang untuk mengisi sel-sel dengan. Ia tidak tahu sel mana yang digunakan kembali untuk diberikan NSIndexPath
. Ini benar-benar harus menjadi tugas pengontrol. Delegasi memungkinkan tampilan tabel untuk memuat logika non-tampilan ini ke objek yang harus memiliki tanggung jawab itu.
Lebih dari itu, Anda tidak dikunci dalam satu delegasi untuk seumur hidup suatu objek. Anda dapat dengan mudah memiliki beberapa sumber data untuk diberikan UITableView
dan beralih di sekitar saat dibutuhkan.
Jadi, di satu sisi, delegasi sangat bagus untuk memasok data ke dan menanggapi interaksi dari suatu objek. Anda akan melihatnya di banyak kelas UIKit, seperti UITableView
, UIPickerView
, UICollectionView
, dll
Tetapi delegasi juga sangat berguna ketika Anda ingin menyampaikan informasi antar objek. Anda dapat dengan mudah membuat protokol Anda sendiri dan mendaftar objek Anda sendiri untuk mengikutinya. Selain itu, metode protokol secara @required
default, tetapi Anda dapat menentukan beberapa metode yang akan@optional
. Ini dapat memberi Anda fleksibilitas yang bagus jika Anda membutuhkannya. Katakanlah Anda memiliki pengontrol tampilan orang tua dan pengontrol tampilan anak. Mungkin Anda menggunakan API Penahanan baru untuk melakukan ini. Biasanya, jika Anda harus meneruskan informasi dari orangtua ke anak, Anda melakukan ini dengan properti. Selesai Tetapi bagaimana jika Anda perlu menyampaikan informasi dari anak kembali ke orang tua? Mungkin sesuatu berubah pada anak dan Anda perlu memberi tahu orang tua. Tentu, Anda bisa melakukan beberapa KVO pada nilai-nilai tertentu. Tapi mungkin Anda ingin tahu kapan tombol ditekan. Cukup buat protokol baru di pengontrol tampilan anak
@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end
@interface MyChildViewController : UIViewController
@property (weak, nonatomic) id <MyChildDelegate> delegate;
@end
Di MyChildViewController, ketika tombol Anda diketuk, cukup periksa apakah delegasi Anda merespons pesan delegasi (jika diperlukan dan delegasi Anda tidak mengimplementasikan metode, Anda akan macet. Anda dapat membuat metode @optional
jika perlu) dan mengirim Itu:
- (IBAction)someButtonTapped:(id)sender {
if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
[self.delegate buttonWasTappedInChild:self];
}
}
Kemudian atur delegasi MyChildViewController Anda ke self
dan terapkan - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController
di controller tampilan induk Anda. LEDAKAN! Anda memiliki informasi yang diteruskan dari anak hingga orang tua. Hubungan antara kedua objek bahkan tidak perlu sedekat orangtua / anak. Ini adalah kontrak layanan, jadi selama objek yang mendaftar menahan akhirnya dari tawar-menawar dengan menerapkan metode yang diperlukan, Anda adalah emas!
CATATAN: Delegasi harus lemah / menetapkan properti, jika tidak Anda akan memasuki siklus penahan di mana tidak ada objek yang dapat dideallokasi.
Semoga ini membantu!