Yetkilendirme nedir ve iOS programlamasında neden önemlidir?


11

Şu anda kendime iOS programlama öğretiyorum ve kafamı sarmak için gerçekten zor bulduğum bir kavram delegasyon. Bu ne? Neden ve nasıl kullanılır? Avantajı nedir? Okuduğum kitaptaki teknik yazıların anlaşılması zor.


4
Sen bulabilirsiniz nesnel c + delegeler kullanışlı taşma yığın etiketi kavşak.

Yanıtlar:


16

Anlamak delegatesiçin anlamanız gerekir protocols.

A protocolbir hizmet sözleşmesi gibidir. Bir nesne (çoğu zaman bir UIViewControlleralt sınıf, ancak her zaman değil) bu sözleşmeyi imzaladığında, "Bana gönderdiğiniz mesajı desteklemek için mantık sağlamakla ilgileniyorum" diyor. Bu, NSNotificationCenterbir ilgi düzeyi için kaydolma ile benzerdir , fark, delegasyon kullanan bir nesne olmaktır, aynı anda yalnızca bir tane olabilir delegate, burada birden fazla nesne aynı şekilde kaydolabilir NSNotification.

Apple heyeti yaygın olarak kullanıyor. Bununla birlikte, Apple'ın API'larının çoğunu diğer dillere blocksbenzeyen bir çok yere taşıdığını görüyorsunuz callbacks.

Bununla birlikte, delegasyonun kendi başına bir tasarım modeli olduğunu iddia etsem de, delegasyon MVC'nin korunmasına yardımcı olur. Modelleri kontrolörlerden ayırmaya yardımcı olur. John Cartwright'ın örneğinde olduğu gibi, UITableViewsatırların ve bölümlerin nasıl görüntüleneceğini bilir. UITableViewCellsPerformans nedeniyle nasıl yeniden kullanılacağını bilir . Diğer tüm şeyleri UIScrollViewbilir. Ancak hangi hücrelerin görüntüleneceğini bilmiyor . Bu hücreleri neyle dolduracağını bilmiyor . Belirli bir hücre için hangi hücrelerin yeniden kullanılacağını bilmiyor NSIndexPath. Bu gerçekten de kontrolörün işi olmalı. Temsilci seçme, tablo görünümünün bu görünüm dışı mantığı yine de bu sorumluluğu taşıması gereken bir nesneye boşaltmasına izin verir.

Dahası, bir nesnenin tüm ömrü boyunca tek bir delege kilitli değilsiniz. Belirli bir veri için çok sayıda veri kaynağına kolayca sahip olabilir UITableViewve gerektiğinde çalışma zamanında bunları değiştirebilirsiniz.

Dolayısıyla, bir yandan temsilci seçme, bir nesneye veri sağlamak ve bir nesneden gelen etkileşimlere yanıt vermek için harikadır. Sen UIKit sınıfları, böyle bir bir sürü görürsünüz UITableView, UIPickerView, UICollectionViewvb

Ancak, temsilciler nesneler arasında bilgi aktarmak istediğinizde de çok yararlıdır. Kendi protokollerinizi kolayca oluşturabilir ve bunları takip etmek için kendi nesnelerinizi kaydedebilirsiniz. Ayrıca, protokol yöntemleri @requiredvarsayılan olarak vardır, ancak bazı yöntemler@optional. Bu, ihtiyacınız olduğunda size güzel bir esneklik verebilir. Diyelim ki bir üst görünüm denetleyiciniz ve bir alt görünüm denetleyiciniz var. Belki bunu yapmak için yeni Containment API'sini kullanıyorsunuzdur. Genellikle, üst öğeden çocuğa bilgi iletmeniz gerekiyorsa, bunu bir özellik ile yaparsınız. Bitti. Peki ya çocuktan ebeveyne bilgi aktarmanız gerekirse? Belki çocukta bir şey değişir ve ebeveynleri bilgilendirmeniz gerekir. Elbette, belirli değerlerde biraz KVO yapabilirsiniz. Ama belki bir düğmeye ne zaman basıldığını bilmek istersiniz. Alt görünüm denetleyicisinde yeni bir protokol oluşturun

@protocol MyChildDelegate
- (void)buttonWasTappedInChild:(MyChildViewController *)childViewController;
@end

@interface MyChildViewController : UIViewController

@property (weak, nonatomic) id <MyChildDelegate> delegate;

@end

MyChildViewController'da, düğmenize dokunulduğunda, temsilcinizin temsilci mesajına yanıt verip vermediğini kontrol edin (gerekirse ve temsilciniz yöntemi uygulamazsa kilitlenir. @optionalGerekirse yöntemi yapabilirsiniz ) ve gönderebilirsiniz o:

- (IBAction)someButtonTapped:(id)sender {
    if ([self.delegate respondsToSelector:@selector(buttonWasTappedInChild:)]) {
        [self.delegate buttonWasTappedInChild:self];
    }
}

Ardından, MyChildViewController temsilcinizi ana görünüm denetleyicinize ayarlayın selfve uygulayın - (void)buttonWasTappedInChild:(MyChildViewController *)childViewController. BOOM! Bir çocuktan ebeveyne kadar bilgileriniz var. İki nesne arasındaki ilişkinin ebeveyn / çocuk kadar yakın olması bile gerekmez. Bu bir hizmet sözleşmesidir, kayıt olan nesne gerekli yöntemleri uygulayarak pazarlığın sonuna kadar devam ettiği sürece, altınsınız!

NOT: Temsilciler zayıf / özellik atamalıdır, aksi takdirde her iki nesnenin de yerleştirilemediği bir tutma döngüsüne girersiniz.

Bu yardımcı olur umarım!


2

Delegeler, bu işlevleri normal nesneye uygulamak mantıklı olmadığında belirli işlevleri uygulayan nesnelerdir. Bir çeşit bağımlılık enjeksiyonudur.

Somut bir örnek için UITableViewDelegate protokolüne bakın. Bir tablo görünümü satırının seçilmesine ilişkin eylemler her uygulamada ve belki de her tablo görünümünde farklı olacağından, bu yöntemlerin bir tablo görünümünün doğrudan uygulanması anlamlı değildir. Temsilcinin bir yöntemi vardır, -tableView:didSelectRowAtIndexPath:böylece uygulamak istediğiniz her ayrı eylem için tablo görünümünü alt sınıflamadan satır seçimini işleyen bir nesne oluşturabilirsiniz.

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.