Ben delegeler nasıl çalıştığını biliyorum ve bunları nasıl kullanabileceğinizi biliyorum.
Ama bunları nasıl oluşturabilirim?
Ben delegeler nasıl çalıştığını biliyorum ve bunları nasıl kullanabileceğinizi biliyorum.
Ama bunları nasıl oluşturabilirim?
Bir amaç-Cı temsilci tahsis edilmiş bir amacı, delegateözelliği bir başka amacı. Bir tane oluşturmak için basitçe ilgilendiğiniz temsilci yöntemleri uygulayan bir sınıf tanımlamak ve temsilci protokolünü uygulama olarak bu sınıfı işaretleyin.
Örneğin, bir olduğunu varsayalım UIWebView. Onun Yetkilinizin uygulamak isterseniz webViewDidStartLoad:yöntemi, böyle bir sınıf oluşturmak olabilir:
@interface MyClass<UIWebViewDelegate>
// ...
@end
@implementation MyClass
- (void)webViewDidStartLoad:(UIWebView *)webView {
// ...
}
@end
Sonra Sınıfım bir örneğini oluşturmak ve web görünümün temsilci olarak atamak olabilir:
MyClass *instanceOfMyClass = [[MyClass alloc] init];
myWebView.delegate = instanceOfMyClass;
On UIWebViewtarafında, muhtemelen temsilci yanıt olmadığını görmek için buna benzer kodu vardır webViewDidStartLoad:kullanarak mesajın respondsToSelector:ve uygunsa gönderin.
if([self.delegate respondsToSelector:@selector(webViewDidStartLoad:)]) {
[self.delegate webViewDidStartLoad:self];
}
Temsilci Özelliği, tipik olarak bildirildi weak(ARC), ya da assignbir nesnenin temsilci genellikle bu nesne için güçlü bir referans tutacağından (ön ARC), döngüler muhafaza önlemek için. (Örneğin, bir görünümü denetleyicisi genellikle içeren görünümün temsilci içindir.)
Kendi delegeleri tanımlamak için, tartışıldığı üzere, bir yerde onların yöntemlerini beyan gerekecek protokoller Apple Dokümanlar . Genellikle resmi bir protokol beyan ederim. UIWebView.h paraphrased bildirge, bu şekilde görünecektir:
@protocol UIWebViewDelegate <NSObject>
@optional
- (void)webViewDidStartLoad:(UIWebView *)webView;
// ... other methods here
@end
Bu senin yetki verilen kişi için özel bir türü oluşturur gibi bu, bir arayüz veya soyut temel sınıf benzer olan UIWebViewDelegatebu durumda. Delege uygulamacılarıdır bu protokolü kabul etmesi gerekir:
@interface MyClass <UIWebViewDelegate>
// ...
@end
Ve sonra protokolde yöntemlerini uygulamak. Olarak protokolde beyan yöntemleri için @optional(çoğu temsilci yöntemleri gibi) kullanarak, birlikte kontrol etmeniz gerekir -respondsToSelector:bunun belirli bir yöntemi çağırmadan önce.
Temsilci yöntemleri tipik delegating sınıf adı başlayarak adlandırılır ve birinci parametre olarak delegating nesne sürer. Onlar da genellikle should-, will- veya yaptım-formu kullanın. Yani, webViewDidStartLoad:yerine (ilk parametre web görünümüdür) loadStarted(örneğin parametre alarak).
Bunun yerine bir temsilci bir seçicinin biz iletiye istediğiniz her zaman yanıt verip kontrol delegeleri ayarlandığında, bu bilgileri önbelleğe alabilir. şöyle Bunu yapmanın bir çok temiz yolu, bir bit maskesini kullanmaktır:
@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 <SomethingDelegate>)aDelegate {
if (delegate != aDelegate) {
delegate = aDelegate;
delegateRespondsTo.didFinishLoadingItem = [delegate respondsToSelector:@selector(something:didFinishLoadingItem:)];
delegateRespondsTo.didFailWithError = [delegate respondsToSelector:@selector(something:didFailWithError:)];
}
}
@end
Ardından, vücutta, bizim temsilci bizim erişerek iletilerini işleme kontrol edebilirsiniz delegateRespondsToyerine göndererek yapı -respondsToSelector:defalarca ve.
Protokoller var önce, bir kullanımı yaygındı kategorisini üzerinde NSObjectbir temsilci uygulamak yöntemlerini ilan etmek. Örneğin, CALayerhalen bu yapar:
@interface NSObject(CALayerDelegate)
- (void)displayLayer:(CALayer *)layer;
// ... other methods here
@end
Bu aslında herhangi bir nesne uygulamak olabilir derleyici söyler displayLayer:.
Daha sonra aynı kullanırsınız -respondsToSelector:bu yöntemi çağırmak için yukarıda açıklandığı gibi bir yaklaşım. Delegeler sadece bu yöntemi uygulamak ve atamak delegate(hayır bir protokole uyan ilan var) özelliği, hepsi bu. Bu yöntem Apple'ın kütüphanelerde yaygın olmakla birlikte, yeni kod bu yaklaşım kirletir beri, yukarıda daha modern protokol yaklaşım kullanmalıdır NSObject(otomatik tamamlama az yararlı kılan) ve zor derleyici yazım hataları ve benzeri hatalar konusunda uyarmak için yapar.
onaylı cevap harika ama sen 1 dakika cevap arıyorsanız bu deneyin:
Bu gibi görünmelidir MyClass.h dosyası (yorumlarla temsilci satırları ekleyin!)
#import <BlaClass/BlaClass.h>
@class MyClass; //define class, so protocol can see MyClass
@protocol MyClassDelegate <NSObject> //define delegate protocol
- (void) myClassDelegateMethod: (MyClass *) sender; //define delegate method to be implemented within another class
@end //end protocol
@interface MyClass : NSObject {
}
@property (nonatomic, weak) id <MyClassDelegate> delegate; //define MyClassDelegate as delegate
@end
MyClass.m dosyası aşağıdaki gibi görünmelidir
#import "MyClass.h"
@implementation MyClass
@synthesize delegate; //synthesise MyClassDelegate delegate
- (void) myMethodToDoStuff {
[self.delegate myClassDelegateMethod:self]; //this will call the method implemented in your other class
}
@end
Başka bir sınıfta temsilci kullanmak için MyVC.h (UIViewController bu durumda MyVC denir):
#import "MyClass.h"
@interface MyVC:UIViewController <MyClassDelegate> { //make it a delegate for MyClassDelegate
}
MyVC.m:
myClass.delegate = self; //set its delegate to self somewhere
temsilci yöntemi uygulamak
- (void) myClassDelegateMethod: (MyClass *) sender {
NSLog(@"Delegates are great!");
}
temsilci desteği oluşturmak için resmi protokol yöntemi kullanırken, seni düzgün türü gibi bir şey ekleyerek (değil derleme süresi çalışma zamanı, olsa) kontrol sağlamak olabileceğini saptadık:
if (![delegate conformsToProtocol:@protocol(MyDelegate)]) {
[NSException raise:@"MyDelegate Exception"
format:@"Parameter does not conform to MyDelegate protocol at line %d", (int)__LINE__];
}
Temsilci erişimci (setDelegate) kodda. Bu hataları en aza indirmek yardımcı olur.
Belki bu ne eksik çizgisinde fazlasıdır:
Eğer bir C ++ gibi bir bakış açısından geliyorsanız, delegeler biraz alışmak alır - ancak temelde 'her zaman çalışır'.
Çalışma şekli bir veya birçok olası temsilci yöntemlerden bazıları için sen NSWindow için delege olarak yazdığı bazı nesne belirlerseniz ancak nesne yalnızca uygulamalar (yöntemleri) sahip olmasıdır. Yani bir şey olur ve NSWindowsizin nesneyi aramak istiyor - bu sadece Objective-c kullanıcısının kullandığı respondsToSelectornesne olarak adlandırılan bu yöntemi istiyorsa belirlemek için yöntem ve ardından çağırır. Bu hedef-c işliyor - yöntemler talep üzerine aranır.
Bu, devam özel bir şey yoktur kendi nesnelerle bunu tamamen önemsiz, sen mesela bir olabilir NSArray27 nesnelerin, tüm nesneleri çeşit, yöntem sahip bunlardan sadece 18 bazı -(void)setToBue;diğer 9 yok. Yani aramaya setToBlue, bitti böyle bir şey gerektiğini 18 tümünde:
for (id anObject in myArray)
{
if ([anObject respondsToSelector:@selector(@"setToBlue")])
[anObject setToBlue];
}
Delegeler hakkında başka şey, her zaman için temsilci ayarlamak zorunda onlar, tutulmaz ki nilsenin içinde MyClass deallocyöntemle.
Lütfen! Delegeler iOS nasıl çalıştığını anlamak için adım öğretici basit adımda aşağıya bakın.
Ben (birinden diğerine gönderilmesi veriler için) iki ViewControllers oluşturduk
Apple tarafından önerilen bir iyi uygulama olarak, uymak için, (tanımı gereği, bir protokoldür) delege için iyi NSObjectprotokolü.
@protocol MyDelegate <NSObject>
...
@end
& Kullanabilirsiniz, yetki verdiğiniz dahilinde opsiyonel yöntemleri (ille uygulanması gerekmez yani yöntemleri) oluşturmak için @optionalböyle ek açıklama:
@protocol MyDelegate <NSObject>
...
...
// Declaration for Methods that 'must' be implemented'
...
...
@optional
...
// Declaration for Methods that 'need not necessarily' be implemented by the class conforming to your delegate
...
@end
İsteğe bağlı olarak belirttiğiniz yöntemleri kullanırken Yani, kontrol (Sınıfındaki) gerek respondsToSelectorgörünümü (yani yetki verdiğiniz uyum sağlamaktadır) aslında opsiyonel yöntem (ler) ya da değil hayata geçirdi eğer.
Ben delege anladıktan sonra bütün bu cevapları anlamlı bir sürü yapmak düşünüyorum. Şahsen C / C ++ karadan ve Fortran vb işte benim 2 dk C ++ paradigma benzer analogları bulma üstlenmek gibi o prosedürel dilde önüne geldi.
Bir C ++ / Java programcısı delegeleri açıklamak olsaydı söyleyebilirim
Delegeler nelerdir? Bunlar başka bir sınıf içinde sınıflara statik noktalar şunlardır. Eğer bir işaretçi atadığınızda, bu sınıfta işlevleri / yöntemleri çağırabilir. Dolayısıyla sizin sınıfının bazı işlevler (C ++ dünyasında - işaretçi bir sınıf nesnesi pointer ile) "delege" olan başka bir sınıfa.
protokolleri nelerdir? Kavramsal olarak bu, bir temsilci sınıf olarak atamayacaksanız sınıfın başlık dosyasına olduğunca benzer amaca hizmet eder. Bir protokol yöntemleri işaretçi bir sınıf içinde bir temsilci olarak kuruldu var sınıfta uygulanan gerekenleri tanımlayan bir açık yoludur.
Nasıl C ++ benzer bir şey yapabilirim? Eğer C ++ bu yapmaya çalıştık varsa, o zaman sınıf tanımında sınıflar (nesneler) için işaretçileri tanımlanması ve ederek temel sınıf delege gibi ek fonksiyonlar sağlayacak diğer sınıflara onları kablolama olacaktır. Ama bu kablolama kodu içinde maitained gerekiyor ve hantal olması ve eğilimli hata olur. Objective C sadece programcılar bu decipline sürdürmeyi değil iyi olduğunu varsayar ve temiz bir uygulama uygulamak için derleyici kısıtlama getirir.
Bir temsilci sadece başka sınıf için bazı işler yapan bir sınıftır. Bu Swift yapılır gösterir biraz saçma (ama umarım aydınlatıcı) Oyun alanı, örneğin aşağıdaki kodu okuyun.
// A protocol is just a list of methods (and/or properties) that must
// be used by any class that adopts the protocol.
protocol OlderSiblingDelegate: class {
// This protocol only defines one required method
func getYourNiceOlderSiblingAGlassOfWater() -> String
}
class BossyBigBrother {
// The delegate is the BossyBigBrother's slave. This position can
// be assigned later to whoever is available (and conforms to the
// protocol).
weak var delegate: OlderSiblingDelegate?
func tellSomebodyToGetMeSomeWater() -> String? {
// The delegate is optional because there might not be anyone
// nearby to boss around.
return delegate?.getYourNiceOlderSiblingAGlassOfWater()
}
}
// PoorLittleSister conforms to the OlderSiblingDelegate protocol
class PoorLittleSister: OlderSiblingDelegate {
// This method is repquired by the protocol, but the protocol said
// nothing about how it needs to be implemented.
func getYourNiceOlderSiblingAGlassOfWater() -> String {
return "Go get it yourself!"
}
}
// initialize the classes
let bigBro = BossyBigBrother()
let lilSis = PoorLittleSister()
// Set the delegate
// bigBro could boss around anyone who conforms to the
// OlderSiblingDelegate protocol, but since lilSis is here,
// she is the unlucky choice.
bigBro.delegate = lilSis
// Because the delegate is set, there is a class to do bigBro's work for him.
// bigBro tells lilSis to get him some water.
if let replyFromLilSis = bigBro.tellSomebodyToGetMeSomeWater() {
print(replyFromLilSis) // "Go get it yourself!"
}
Gerçek uygulamada, delegeler genellikle aşağıdaki durumlarda kullanılır
sınıflar temsilci sınıfı gerekli protokole uygun olması dışında birbirlerine önceden hakkında hiçbir şey bilmek gerekmez.
Çok şu iki makale de okumanızı öneririz. Onlar beni daha iyi delege anlamanıza yardımcı dokümantasyon yaptı.
Eğer geliştirilmiş bir sınıf var ve bazı olay gerçekleştiğinde bunu bildirmek edebilmek için bir temsilci mal beyanında istiyorum Diyelim:
@class myClass;
@protocol myClassDelegate <NSObject>
-(void)myClass:(MyClass*)myObject requiredEventHandlerWithParameter:(ParamType*)param;
@optional
-(void)myClass:(MyClass*)myObject optionalEventHandlerWithParameter:(ParamType*)param;
@end
@interface MyClass : NSObject
@property(nonatomic,weak)id< MyClassDelegate> delegate;
@end
Böylece bir protokol beyan MyClassbaşlık dosyasına (veya ayrı başlık dosyası) olduğunu ve temsilci / uygulamalıdır ardından bir özellik beyan etmelidir gerekli / opsiyonel olay işleyicileri beyan MyClass(Çeşidi id< MyClassDelegate>uyan herhangi nesnel c sınıfı anlamına gelir) protokol MyClassDelegate, bu döngüyü muhafaza önlemek için çok önemlidir, temsilci özelliği zayıf olarak ilan fark edeceğiz (çoğunlukla temsilci korur MyClasssen, ikisi de birbirleriyle ve ne koruyacaktır korumak olarak temsilci ilan eğer öyleyse örneğini bunlardan hiç) çıkacak.
Ayrıca protokol yöntemleri geçer göreceksiniz MyClasstemsilci bazı yöntemleri çağırmak istiyorum bu durumda en iyi yöntem parametre olarak temsilciye örneği MyClasstemsilci olarak kendini ilan ettiğinde yardımcı olur, aynı zamanda örnek ve MyClassDelegateçoklu için MyClassbirden fazla olduğunda gibi durumlarda, UITableView'sGözlerinde farklı örneklerini ViewControllerve kendisini beyan UITableViewDelegatehepsine.
ve gözündeki MyClassaşağıdaki şekilde beyan olaylarla temsilci bildirmek:
if([_delegate respondsToSelector:@selector(myClass: requiredEventHandlerWithParameter:)])
{
[_delegate myClass:self requiredEventHandlerWithParameter:(ParamType*)param];
}
Temsilci Eğer (protokol yöntemi gereklidir bile) temsilci bunu uygulamıyor ve uygulama söz konusu ise kilitlenmesine durumunda çağırmak üzere olan protokol yöntemine yanıt verirse öncelikle kontrol edin.
Tamam, bu gerçekten soruya bir cevap değil, ancak kendi temsilciyi nasıl yukarı arıyorsanız belki çok basit bir şey sizin için daha iyi bir cevap olabilir.
Nadiren gerekir çünkü ben hiç benim delege uygulamak. Ben bir temsilci nesnesi için SADECE BİR temsilci olabilir. Yani bildirimleri ile çok daha iyi fazla yolu iletişimi için temsilci / verilerini ileten istiyorum.
NSNotification birden fazla alıcıya nesneleri geçebilir ve kullanımı çok kolaydır. Bu gibi çalışır:
MyClass.m dosyası aşağıdaki gibi görünmelidir
#import "MyClass.h"
@implementation MyClass
- (void) myMethodToDoStuff {
//this will post a notification with myClassData (NSArray in this case) in its userInfo dict and self as an object
[[NSNotificationCenter defaultCenter] postNotificationName:@"myClassUpdatedData"
object:self
userInfo:[NSDictionary dictionaryWithObject:selectedLocation[@"myClassData"] forKey:@"myClassData"]];
}
@end
Başka sınıflar içinde bildirim kullanmak için: gözlemci olarak sınıf ekleyin:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(otherClassUpdatedItsData:) name:@"myClassUpdatedData" object:nil];
seçici Uygulanışı:
- (void) otherClassUpdatedItsData:(NSNotification *)note {
NSLog(@"*** Other class updated its data ***");
MyClass *otherClass = [note object]; //the object itself, you can call back any selector if you want
NSArray *otherClassData = [note userInfo][@"myClassData"]; //get myClass data object and do whatever you want with it
}
gözlemci sanki senin sınıfını kaldırmak unutmayın
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
İşte delege oluşturmak için basit bir yöntemdir
.h dosyasında Protokolü oluşturun. emin UIViewController adından @class kullanarak protokolden önce tanımlanmış olduğundan emin olun< As the protocol I am going to use is UIViewController class>.
Adım: 1: UIViewController sınıfının alt sınıf olacak ve ikinci ViewController bu sınıf atar "YourViewController" adlı yeni bir sınıf Protokolü oluşturun.
2: Adım "YourViewController" dosyaya gidin ve aşağıdaki değiştirin:
#import <UIKit/UIkit.h>
@class YourViewController;
@protocol YourViewController Delegate <NSObject>
@optional
-(void)defineDelegateMethodName: (YourViewController *) controller;
@required
-(BOOL)delegateMethodReturningBool: (YourViewController *) controller;
@end
@interface YourViewController : UIViewController
//Since the property for the protocol could be of any class, then it will be marked as a type of id.
@property (nonatomic, weak) id< YourViewController Delegate> delegate;
@end
Protokol davranış tanımlanan yöntemler @optional ile kontrol edilir ve protokol tanımının bir parçası olarak @required edilebilir.
Aşama: 3: Delegenin Uygulama
#import "delegate.h"
@interface YourDelegateUser ()
<YourViewControllerDelegate>
@end
@implementation YourDelegateUser
- (void) variousFoo {
YourViewController *controller = [[YourViewController alloc] init];
controller.delegate = self;
}
-(void)defineDelegateMethodName: (YourViewController *) controller {
// handle the delegate being called here
}
-(BOOL)delegateMethodReturningBool: (YourViewController *) controller {
// handle the delegate being called here
return YES;
}
@end
Bunu aramadan önce // yöntemle olmadığını testi tanımlanmıştır
- (void) someMethodToCallDelegate {
if ([[self delegate] respondsToSelector:@selector(defineDelegateMethodName:)]) {
[self.delegate delegateMethodName:self];
}
}
Kendi temsilci oluşturmak için öncelikle uygulamadan, bir protokol oluşturmak ve gerekli yöntemleri ilan etmek gerekir. Eğer temsilci veya temsilci yöntemleri uygulamak istediğiniz yere Ve sonra başlık sınıfa bu protokolü uygulamak.
Bir protokol aşağıda beyan edilmelidir:
@protocol ServiceResponceDelegate <NSObject>
- (void) serviceDidFailWithRequestType:(NSString*)error;
- (void) serviceDidFinishedSucessfully:(NSString*)success;
@end
Bu, bazı görev yapılmalıdır hizmet sınıfıdır. Bu temsilci ve nasıl temsilci ayarlamak için nasıl tanımlanacağını gösterir. uygulama sınıfında görev temsilcinin yöntemleri denir tamamlandıktan sonra.
@interface ServiceClass : NSObject
{
id <ServiceResponceDelegate> _delegate;
}
- (void) setDelegate:(id)delegate;
- (void) someTask;
@end
@implementation ServiceClass
- (void) setDelegate:(id)delegate
{
_delegate = delegate;
}
- (void) someTask
{
/*
perform task
*/
if (!success)
{
[_delegate serviceDidFailWithRequestType:@”task failed”];
}
else
{
[_delegate serviceDidFinishedSucessfully:@”task success”];
}
}
@end
Bu hizmet sınıfı kendisine temsilci ayarlayarak denir yerden ana görünümü sınıftır. Ve ayrıca protokol başlığı sınıfında uygulanmaktadır.
@interface viewController: UIViewController <ServiceResponceDelegate>
{
ServiceClass* _service;
}
- (void) go;
@end
@implementation viewController
//
//some methods
//
- (void) go
{
_service = [[ServiceClass alloc] init];
[_service setDelegate:self];
[_service someTask];
}
İşte bu, ve operasyon / görev bittikten sonra bu sınıfta temsilci yöntemleri uygulayarak kontrol geri gelecektir.
Yasal Uyarı: bu Swiftbir nasıl oluşturulacağını sürümü delegate.
Yani, delegeler nelerdir? Yazılım geliştirmede, belirli bir bağlam içinde sık görülen sorunları çözmek için yardımcı genel yeniden çözüm mimarileri var ..., bunlar “şablonlar”, tabiri caizse, en iyi tasarım desenleri olarak bilinir. Delegeler belirli bir olay gerçekleştiğinde bir nesnenin başka bir nesneyle ileti göndermesine izin veren bir tasarım deseni vardır. A, bir işlem gerçekleştirmek için bir nesne B çağıran bir nesne düşünün. eylem tamamlandıktan sonra, nesne A B görevi tamamladığını biliyoruz ve gerekli önlemleri almalı, bu delegelerin yardımıyla elde edilebilir!
Daha iyi bir açıklama için, basit bir uygulamada Swift ile, sınıflar arasındaki veri geçiren özel temsilci nasıl oluşturulacağını göstermek için gidiyorum indirerek veya bu marş projesini klonlama ve çalıştırın başlayın!
İki sınıflarıyla bir uygulamayı bakın edebilir ViewController Ave ViewController B. B musluğu arka plan rengini değiştirir iki görünümü vardır ViewController, hiçbir şey çok karmaşık hakkı? iyi şimdi sınıf B görüşleri dinleniyor zaman da sınıf A arka plan rengini değiştirmek için kolay bir şekilde düşünelim.
Sorun bu görüşleri sınıf B parçası olan ve sınıf A hakkında hiçbir fikrim yok, bu yüzden bu iki sınıf arasında iletişim kurmak için bir yol bulmalıyız olması ve heyet parladığı bu. İhtiyacınız olduğunda size kısa notlar olarak kullanabilirsiniz yüzden 6 adımda içine uygulanmasını ayrıldı.
1. adım: ClassBVC dosyasında Pragma işareti 1. adımda arayın ve şu eklemek
//MARK: step 1 Add Protocol here.
protocol ClassBVCDelegate: class {
func changeBackgroundColor(_ color: UIColor?)
}
İlk adım bir oluşturmaktır protocolbu durumda biz, sınıf B protokolü yaratacak protokol içeride size uygulama gereksinimlerine göre istediğiniz kadar birçok işlev oluşturabilir. Bu durumda, sadece isteğe bağlı bir kabul basit bir fonksiyonu var UIColorbağımsız değişken olarak. Kelimesini ekleyerek protokolleri adlandırmak için iyi bir uygulama mı delegatebu durumda, sınıf adının sonunda, ClassBVCDelegate.
2. adım: Giriş Pragma işareti 2. adımda arayın ClassVBCve bu ekleme
//MARK: step 2 Create a delegate property here.
weak var delegate: ClassBVCDelegate?
Burada biz sadece sınıf için bir temsilci özelliğini oluşturmak, bu özellik benimsemek gerekir protocoltürü ve bu isteğe olmalıdır. Ayrıca, sadece bu anahtar kelimeyi eklemeyi unutmayın, bu araçlar şu an için merak etmeyin bilmiyorum eğer, döngüleri ve potansiyel bellek sızıntılarını tutmak önlemek için mülkiyet önce zayıf anahtar kelime eklemek gerekir.
3. adım: handleTap içindeki Pragma işareti 3. adımda arayın methodiçinde ClassBVCve bu ekleme
//MARK: step 3 Add the delegate method call here.
delegate?.changeBackgroundColor(tapGesture.view?.backgroundColor)
Biliyorsunuz, uygulamayı çalıştırın ve herhangi bir görünümde dokunun gereken bir şey, herhangi bir yeni davranış görmez ve bu doğru ama işaret etmek istiyorum şey olduğunu temsilci çağrıldığında Bu çökmesini değil uygulama ve biz isteğe bağlı değeri oluşturun ve henüz var olmayan hatta devredilen çökme olmaz bu yüzden, çünkü bu kadar. Şimdi geçelim ClassAVCdosyalarsanız ve yapmak, delege.
4. adım: in handleTap yönteminin içine Pragma işareti 4. adımda arayın ClassAVCve bunun gibi sınıf türüne sonraki ekleyin.
//MARK: step 4 conform the protocol here.
class ClassAVC: UIViewController, ClassBVCDelegate {
}
Şimdi ClassAVC kabul ClassBVCDelegateprotokolü, kendi derleyici size Tip ClassBVCDelegate ' 'ClassAVC protokole uymuyor'”şeklinde bir hata veriyor ve bu yalnızca henüz protokolün yöntemleri kullanmak vermedi anlamına geldiğini görebilirsiniz, hayal A sınıfı protokolü benimser zaman sınıf B ile sözleşme imzalama gibi ve bu sözleşme diyor “Herhangi sınıf bana işlevlerini kullanabilirsiniz GEREKİR benimseyerek!”
Hızlı not: Bir geliyorsa Objective-Cmuhtemelen de bu yöntem isteğe bağlı hale hatayı sus ki düşünüyorsun arka ama benim sürpriz için ve muhtemelen senin, Swiftdil seçmeli desteklemez protocolssen oluşturabilir bunu yapmak istiyorsanız, şunlara ait bir uzantısı protocolveya içinde @objc anahtar kelime kullanmak protocoluygulanması.
Sana farklı bölün tercih ederim farklı opsiyonel yöntemlerle bir protokol oluşturmak için varsa Şahsen, protocolsbenim nesnelere tek sorumluluk verme kavramını takip edecek şekilde, ancak belirli uygulamaya göre değişebilir.
burada isteğe bağlı yöntemler hakkında iyi bir makale.
5. adım: segue yöntemine hazırlanmak ve bu eklenti içindeki Pragma işareti 5. adımda arayın
//MARK: step 5 create a reference of Class B and bind them through the `prepareforsegue` method.
if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? ClassBVC {
classBVC.delegate = self
}
Burada biz sadece bir örneğini oluştururken ClassBVCve kendine olan temsilci atamak, ancak kendinden burada nedir? kuyu, kendini olduğu ClassAVCdelege edildiği!
adım 6: Son olarak, içinde Pragma 6. adımda aramaya ClassAVCve en işlevlerini kullanmasına izin protocol, fonk yazmaya başlayın changeBackgroundColor ve bunu otomatik doldurarak olduğunu sizin için göreceksiniz. O, bu örnekte, sadece arka plan rengi değişir içeride herhangi uygulanmasını ekleyebilir, bu eklenti.
//MARK: step 6 finally use the method of the contract
func changeBackgroundColor(_ color: UIColor?) {
view.backgroundColor = color
}
Şimdi app koş!
Delegatesher yerde ve bir oluşturursanız muhtemelen, hatta fark etmeden bunları kullanmak tableviewsize heyeti, birçok sınıfları kullanılan geçmişte UIKITçevrelerindeki işlerin ve diğer birçok frameworksçok onlar bu ana sorunları çözmek.
Tebrikler, az önce bir özel temsilci uygulamak, ben muhtemelen sadece bunun için, bu kadar sorun düşündüğünü biliyoruz? kuyu, heyet bir olmak istiyorsanız anlamak çok önemli bir tasarım deseni olan iOSgeliştirici ve her zaman onlar nesneler arasında bire bir ilişki olduğunu unutmayın.
Orijinal öğretici görebilirsiniz burada
ViewController.h
@protocol NameDelegate <NSObject>
-(void)delegateMEthod: (ArgType) arg;
@end
@property id <NameDelegate> delegate;
ViewController.m
[self.delegate delegateMEthod: argument];
MainViewController.m
ViewController viewController = [ViewController new];
viewController.delegate = self;
Yöntem:
-(void)delegateMEthod: (ArgType) arg{
}
Cevap aslında cevap, ama ben bir temsilci oluşturma için size "kopya kâğıdı" vermek istiyorum:
DELEGATE SCRIPT
CLASS A - Where delegate is calling function
@protocol <#Protocol Name#> <NSObject>
-(void)delegateMethod;
@end
@interface <#Some ViewController#> : <#UIViewController#>
@property (nonatomic, assign) id <<#Protocol Name#>> delegate;
@end
@implementation <#Some ViewController#>
-(void)someMethod {
[self.delegate methodName];
}
@end
CLASS B - Where delegate is called
@interface <#Other ViewController#> (<#Delegate Name#>) {}
@end
@implementation <#Other ViewController#>
-(void)otherMethod {
CLASSA *classA = [[CLASSA alloc] init];
[classA setDelegate:self];
}
-delegateMethod() {
}
@end
online bir ürün satın eğer nakliye tamamlandı alırsa bir örnekle başlayalım, farklı teams.So tarafından ele nakliye / teslimat gibi sürecinden geçer, nakliye ekibi dağıtım takımına haber & o yayın gibi bir iletişim bu bilgilerin gerekenin Başkalarının / satıcı sadece gerekli kişilere bu bilgi aktarmak isteyebilirsiniz için havai olurdu.
Bizim app açısından düşünmek, yani bir olay bir online sipariş olabilir ve farklı takım birden görünümler gibi olabilir.
İşte kod dağıtım ekibi olarak Kargo ekibi ve DeliveryView olarak ShippingView düşünün geçerli:
//Declare the protocol with functions having info which needs to be communicated
protocol ShippingDelegate : class {
func productShipped(productID : String)
}
//shippingView which shows shipping status of products
class ShippingView : UIView
{
weak var delegate:ShippingDelegate?
var productID : String
@IBAction func checkShippingStatus(sender: UIButton)
{
// if product is shipped
delegate?.productShipped(productID: productID)
}
}
//Delivery view which shows delivery status & tracking info
class DeliveryView: UIView,ShippingDelegate
{
func productShipped(productID : String)
{
// update status on view & perform delivery
}
}
//Main page on app which has both views & shows updated info on product whole status
class ProductViewController : UIViewController
{
var shippingView : ShippingView
var deliveryView : DeliveryView
override func viewDidLoad() {
super.viewDidLoad()
// as we want to update shipping info on delivery view, so assign delegate to delivery object
// whenever shipping status gets updated it will call productShipped method in DeliveryView & update UI.
shippingView.delegate = deliveryView
//
}
}
Benim bakış olarak bu temsilci yöntemi için ayrı bir sınıf oluşturmak ve nereye istediğiniz kullanabilirsiniz.
Benim Özel DropDownClass.h içinde
typedef enum
{
DDSTATE,
DDCITY
}DropDownType;
@protocol DropDownListDelegate <NSObject>
@required
- (void)dropDownDidSelectItemWithString:(NSString*)itemString DropDownType:(DropDownType)dropDownType;
@end
@interface DropDownViewController : UIViewController
{
BOOL isFiltered;
}
@property (nonatomic, assign) DropDownType dropDownType;
@property (weak) id <DropDownListDelegate> delegate;
@property (strong, nonatomic) NSMutableArray *array1DropDown;
@property (strong, nonatomic) NSMutableArray *array2DropDown;
O in.m dosyası sonra nesnelerle dizi oluşturmak,
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
CGFloat rowHeight = 44.0f;
return rowHeight;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return isFiltered?[self.array1DropDown count]:[self.array2DropDown count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *simpleTableIdentifier = @"TableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
if (self.delegate) {
if (self.dropDownType == DDCITY) {
cell.textLabel.text = [self.array1DropDown objectAtIndex:indexPath.row];
}
else if (self.dropDownType == DDSTATE) {
cell.textLabel.text = [self.array2DropDown objectAtIndex:indexPath.row];
}
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self dismissViewControllerAnimated:YES completion:^{
if(self.delegate){
if(self.dropDownType == DDCITY){
[self.delegate dropDownDidSelectItemWithString:[self.array1DropDown objectAtIndex:indexPath.row] DropDownType:self.dropDownType];
}
else if (self.dropDownType == DDSTATE) {
[self.delegate dropDownDidSelectItemWithString:[self.array2DropDown objectAtIndex:indexPath.row] DropDownType:self.dropDownType];
}
}
}];
}
İşte bütün size örnek want.for bu temsilci yöntemi kullanabilirsiniz Özel temsilci class.after için belirlenen ...
bundan sonra benim başka viewcontroller ithalat
Böyle temsilci yöntemini çağırmak için eylem oluşturmak
- (IBAction)dropDownBtn1Action:(id)sender {
DropDownViewController *vehicleModelDropView = [[DropDownViewController alloc]init];
vehicleModelDropView.dropDownType = DDCITY;
vehicleModelDropView.delegate = self;
[self presentViewController:vehicleModelDropView animated:YES completion:nil];
}
Böyle olduğu çağrı temsilci yönteminden sonra
- (void)dropDownDidSelectItemWithString:(NSString *)itemString DropDownType:(DropDownType)dropDownType {
switch (dropDownType) {
case DDCITY:{
if(itemString.length > 0){
//Here i am printing the selected row
[self.dropDownBtn1 setTitle:itemString forState:UIControlStateNormal];
}
}
break;
case DDSTATE: {
//Here i am printing the selected row
[self.dropDownBtn2 setTitle:itemString forState:UIControlStateNormal];
}
default:
break;
}
}
//1.
//Custom delegate
@protocol TB_RemovedUserCellTag <NSObject>
-(void)didRemoveCellWithTag:(NSInteger)tag;
@end
//2.
//Create a weak reference in a class where you declared the delegate
@property(weak,nonatomic)id <TB_RemovedUserCellTag> removedCellTagDelegate;
//3.
// use it in the class
[self.removedCellTagDelegate didRemoveCellWithTag:self.tag];
//4. import the header file in the class where you want to conform to the protocol
@interface MyClassUsesDelegate ()<TB_RemovedUserCellTag>
@end
// 5. Sınıf .m yöntemi uygulamak - (void) didRemoveCellWithTag: (NSInteger) etiketi {NSLog @ ( "Etiket" % s, etiket);
}
Delege: - oluştur
@protocol addToCartDelegate <NSObject>
-(void)addToCartAction:(ItemsModel *)itemsModel isAdded:(BOOL)added;
@end
Gönder ve veri gönderen görüntülemek için temsilci atamak lütfen
[self.delegate addToCartAction:itemsModel isAdded:YES];