如何在Objective-C中建立委託?

我知道表明們的工做方式,我知道如何使用它們。 程序員

可是我該如何建立呢? 函數


#1樓

批准的答案很棒,但若是您正在尋找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!");
}

#2樓

請! 查看如下簡單的分步教程,瞭解Delegates如何在iOS中工做。 orm

在iOS中表明 server

我建立了兩個ViewControllers(用於將數據從一個發送到另外一個)

  1. FirstViewController實現委託(提供數據)。
  2. SecondViewController聲明委託(將接收數據)。

#3樓

我認爲,一旦你理解了表明,全部這些答案都頗有意義。 就我的而言,我來自C / C ++以前,在此以前的程序語言如Fortran等,因此這是我在C ++範例中尋找相似相似物的2分鐘。

若是我要向C ++ / Java程序員解釋表明,我會說

表明們是什麼? 這些是指向另外一個類中的類的靜態指針。 分配指針後,能夠調用該類中的函數/方法。 所以,您的類的某些函數被「委託」(在C ++世界中 - 由類對象指針指向)到另外一個類。

什麼是協議? 從概念上講,它的做用與您指定爲委託類的類的頭文件相似。 協議是一種明確的方法,用於定義須要在類中實現哪些方法的指針被設置爲類中的委託。

我怎樣才能在C ++中作相似的事情? 若是您嘗試在C ++中執行此操做,則能夠經過在類定義中定義指向類(對象)的指針,而後將它們鏈接到其餘類,這些類將提供其餘函數做爲基類的委託。 可是這種佈線須要在代碼中保留,而且會很笨拙且容易出錯。 Objective C假設程序員不擅長維護這個decipline並提供編譯器限制來強制執行乾淨的實現。


#4樓

好吧,這不是問題的真正答案,可是若是你正在查找如何製做本身的表明,那麼更簡單的東西多是更好的答案。

我很難實現個人表明,由於我不多須要。 我只能擁有一個委託對象的委託。 所以,若是您但願您的表明以單向方式進行通訊/傳遞數據,而不是經過通知更好。

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];
}

#5樓

做爲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若是視圖(符合您的委託)實際上已實現您的可選方法。

相關文章
相關標籤/搜索