Nasıl Objective-C temsilciler oluşturabilirim?
Delegeler nasıl çalıştığını biliyorum, ve bunları kullanmak gerektiğini çok iyi biliyorum.
Ama onları nasıl oluşturabilirim?
CEVAP
Objective-C bir temsilci delegate
özelliği başka bir nesneye atanmış olan bir nesnedir. Bir tane oluşturmak için, sadece temsilci protokolün uygulanması olarak ilgilendiğiniz temsilci yöntemler uygulayan, sınıf işareti olan bir sınıf tanımlayın.
Örneğin, UIWebView
olduğunu varsayalım. Eğer onun temsilci 32 ** yöntemi uygulamak istiyorsanız, bu gibi bir sınıf oluşturabilirsiniz:
@interface MyClass<UIWebViewDelegate>
// ...
@end
@implementation MyClass
- (void)webViewDidStartLoad:(UIWebView *)webView {
// ...
}
@end
Sonra Sınıfım örneği oluşturmak ve web görünümü temsilci olarak atayabilirsiniz:
MyClass *instanceOfMyClass = [[MyClass alloc] init];
myWebView.delegate = instanceOfMyClass;
UIWebView
tarafında, muhtemelen eğer temsilci webViewDidStartLoad:
ileti respondsToSelector: kullanarak yanıt olmadığını görmek için buna benzer bir kod var ve eğer uygunsa gönderin.
if([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
[self.delegate webViewDidStartLoad:self];
}
Temsilci özelliği kendisi tipik olarak ilan etti weak
(ARC) veya assign
(pre-ARC) önlemek korumak döngüler beri temsilci nesnesi genellikle tutan güçlü bir referans nesnesi. (Örneğin, görünüm denetleyicisi genellikle içeren bir bakış temsilci.)
Sınıflar için Delege yapma
Kendi delegeleri belirlemek için, Apple Docs on protocols anlatıldığı gibi yöntemleri bir yere bildirmek gerekiyor. Genellikle resmi bir protokol bildirin. Bildirgede, UİWebView gelen başka sözcüklerle ifade.h, bu gibi görünecektir:
@protocol UIWebViewDelegate <NSObject>
@optional
- (void)webViewDidStartLoad:(UIWebView *)webView;
// ... other methods here
@end
Bu temsilci, bu durumda UİWebViewDelegate için özel bir tür oluşturur gibi bir arayüz veya soyut temel sınıf paraleldir. Temsilci uygulayıcıları bu Protokolü kabul etmek gerekir:
@interface MyClass <UIWebViewDelegate>
// ...
@end
Ve sonra protokolde yöntemleri uygulamak. Yöntemleri @optional
protokolünde bildirilen (en temsilci yöntemleri gibi), belirli bir yöntem çağırmadan önce -respondsToSelector:
ile kontrol etmeniz gerekir.
Adlandırma
Temsilci yöntemler genellikle delege sınıf adı ile başlayan adlandırılır ve ilk parametre olarak bir delege nesnesi. Onlar da sık sık gerekir mi, yoksa form olacak, bir kullanın. Yani webViewDidStartLoad:
(ilk parametre web görünümü) yerine loadStarted
(herhangi bir parametre alarak) Örneğin.
Hız İyileştirmeleri
Bir temsilci seçici yanıt verip vermediğini kontrol etmek yerine her zaman mesaj vermek istiyoruz, delegeler ayarlandığında bu bilgileri önbelleğe alabilir. Bunu yapmak için çok temiz bir şekilde aşağıdaki gibi bir bit kullanın
@protocol SomethingDelegate <NSObject>
@optional
- (void)something:(id)something didFinishLoadingItem:(id)item;
- (void)something:(id)something didFailWithError:(NSError *)error;
@end
@interface Something : NSObject
@property (nonatomic, weak) id <SomethingDelegate> delegate;
@end
@implementation Something {
struct {
unsigned int didFinishLoadingItem:1;
unsigned int didFailWithError:1;
} delegateRespondsTo;
}
@synthesize delegate;
- (void)setDelegate:(id <JSSomethingDelegate>)aDelegate {
if (delegate != aDelegate) {
delegate = aDelegate;
delegateRespondsTo.didFinishLoadingItem = [delegate respondsToSelector:@selector(something:didFinishLoadingItem:)];
delegateRespondsTo.didFailWithError = [delegate respondsToSelector:@selector(something:didFailWithError:)];
}
}
@end
SONRA, VÜCUTTA, bizim temsilci tekrar tekrar -respondsToSelector:
gönderme delegateRespondsTo
yapı girerek yerine iletileri işleyen kontrol edebiliriz.
Resmi Olmayan Temsilciler
Protokoller var olmadan önce, ortak NSObject
category bir temsilci uygulamak yöntemleri bildirmek için kullanın. , 26* *hala örneğin bu:
@interface NSObject(CALayerDelegate)
- (void)displayLayer:(CALayer *)layer;
// ... other methods here
@end
Bu aslında herhangi bir nesne displayLayer:
uygulayabilir derleyici söyler.
O zaman yukarıda bu yöntemi çağırmak için açıklandığı gibi -respondsToSelector:
aynı yaklaşımı kullanabilirsiniz. Delegeler sadece bu yöntemi uygulamak ve delegate
özelliği atamak, ve o (bir protokol için uygun ilan yok). Bu yöntem yaygın olarak Apple'ın kitaplıklar, ama yeni bir kod kullanmanız gerekir daha modern protokolü yaklaşım şeyden beri bu yaklaşım kirletiyor NSObject
(otomatik tamamlama yapar daha az yararlı) ve zorlaştırıyor için derleyici hakkında sizi uyarır yazım hataları ve benzeri hatalar.
Nasıl Objective-C temsilciler / protok...
Nasıl Objective-C özel temsilciler kul...
Nasıl bir dize Objective-C başka bir d...
Nasıl JavaScript iki boyutlu bir dizi ...
Nasıl SVN bir şube oluşturabilirim?...