我知道表明們的工做方式,我知道如何使用它們。 程序員
可是我該如何建立呢? 函數
批准的答案很棒,但若是您正在尋找1分鐘的答案,請嘗試如下方法: post
MyClass.h文件應以下所示(添加帶註釋的委託行!) this
#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文件應以下所示 atom
#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
要在另外一個類中使用您的委託(在本例中稱爲MyVC的UIViewController)MyVC.h: spa
#import "MyClass.h" @interface MyVC:UIViewController <MyClassDelegate> { //make it a delegate for MyClassDelegate }
MyVC.m: 指針
myClass.delegate = self; //set its delegate to self somewhere
實現委託方法 code
- (void) myClassDelegateMethod: (MyClass *) sender { NSLog(@"Delegates are great!"); }
請! 查看如下簡單的分步教程,瞭解Delegates如何在iOS中工做。 orm
在iOS中表明 server
我建立了兩個ViewControllers(用於將數據從一個發送到另外一個)
我認爲,一旦你理解了表明,全部這些答案都頗有意義。 就我的而言,我來自C / C ++以前,在此以前的程序語言如Fortran等,因此這是我在C ++範例中尋找相似相似物的2分鐘。
若是我要向C ++ / Java程序員解釋表明,我會說
表明們是什麼? 這些是指向另外一個類中的類的靜態指針。 分配指針後,能夠調用該類中的函數/方法。 所以,您的類的某些函數被「委託」(在C ++世界中 - 由類對象指針指向)到另外一個類。
什麼是協議? 從概念上講,它的做用與您指定爲委託類的類的頭文件相似。 協議是一種明確的方法,用於定義須要在類中實現哪些方法的指針被設置爲類中的委託。
我怎樣才能在C ++中作相似的事情? 若是您嘗試在C ++中執行此操做,則能夠經過在類定義中定義指向類(對象)的指針,而後將它們鏈接到其餘類,這些類將提供其餘函數做爲基類的委託。 可是這種佈線須要在代碼中保留,而且會很笨拙且容易出錯。 Objective C假設程序員不擅長維護這個decipline並提供編譯器限制來強制執行乾淨的實現。
好吧,這不是問題的真正答案,可是若是你正在查找如何製做本身的表明,那麼更簡單的東西多是更好的答案。
我很難實現個人表明,由於我不多須要。 我只能擁有一個委託對象的委託。 所以,若是您但願您的表明以單向方式進行通訊/傳遞數據,而不是經過通知更好。
NSNotification能夠將對象傳遞給多個收件人,而且它很是易於使用。 它的工做原理以下:
MyClass.m文件應以下所示
#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
要在另外一個類中使用您的通知:將類添加爲觀察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(otherClassUpdatedItsData:) name:@"myClassUpdatedData" object:nil];
實現選擇器:
- (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 }
若是是,請不要忘記以觀察者的身份刪除您的班級
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
做爲Apple推薦的一種好的作法,表明(根據定義,它是一個協議)符合NSObject
協議是有益的。
@protocol MyDelegate <NSObject> ... @end
&在您的委託中建立可選方法(即不必定須要實現的方法),您可使用@optional
註釋,以下所示:
@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
所以,當您使用已指定爲可選的方法時,您須要(在您的類中)檢查respondsToSelector
若是視圖(符合您的委託)實際上已實現您的可選方法。