2011-12-12 59 views
2

我想知道如何在目標C中實現委託模式。但討論幾乎完全集中在協議的採用,然後實現代表方法,這些委託方法帶有特定的協議 - 或 - 委託原則 - 或單獨的協議。如何在目標C中創建委託人?

我無法找到的是一個關於如何編寫將作爲委託人的類的簡單易懂的材料。我的意思是這個班級,其中一些事件的信息將來自哪一類,並提供用於接收該信息的協議 - 這種類型的2in1描述。 (協議和委託)。爲了我的學習目的,我想使用一個iPhone,一個Cocoa touch應用程序和Xcode4.2,使用ARC,不使用Storyboard或NIBs,去學習下面的例子。

讓我們來創建一個名爲「Delegator」的類,它是NSObject的一個子類。對被代理類已NSString的實例變量命名爲「報告」,並採用UIAccelerometerDelegate protocol.In委託人實現,我將實現委託方法

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration 

此委託方法將創建一個的NSString @「myReport」,並將其存儲在報告變量中,任何時候都有一個加速度計事件。此外,我想要第二個名爲ReportsStorage的類(NSobject的子類),它可以在其實例變量lastReport中存儲一些Nsstring(報告)。 目前爲止這麼好。 現在讓我們回到Delegator類。我想在Delegator中實現一個名爲ReportsDelegate的協議,它將通知採用它的類(ReportsStorage類),報告已生成並將通過委託方法傳遞此報告,這應該是(我相信)類似於這

-(void)delegator:(Delegator *)delegator didCreateNewReport:(NSString *)report; 

能否請您爲委託者類(包括在「委託」屬性)的代碼,將做到這一點,有着怎樣的每一行代碼句話的含義?

由於提前,EarlGrey

+0

可能重複[如何在Objective-C的委託的工作?( http://stackoverflow.com/questions/1045803/how-does-a-delegate-work-in-objective-c) – vikingosegundo

回答

3

你需要委託財產申報作爲id<ReportsDelegate>類型。也就是說,符合ReportsDelegate協議(<ReportsDelegate>)的任何對象類型(id)。然後,如果委託方法被認爲是可選的,請檢查委託在調用之前是否響應該選擇器。 (respondsToSelector:)。

像這樣:

Delegator.h

#import <Foundation/Foundation.h> 

// Provide a forward declaration of the "Delegator" class, so that we can use 
// the class name in the protocol declaration. 
@class Delegator; 

// Declare a new protocol named ReportsDelegate, with a single optional method. 
// This protocol conforms to the <NSObject> protocol 
@protocol ReportsDelegate <NSObject> 
@optional 
-(void)delegator:(Delegator *)delegator didCreateNewReport:(NSString *)report; 
@end 

// Declare the actual Delegator class, which has a single property called 'delegate' 
// The 'delegate' property is of any object type, so long as it conforms to the 
// 'ReportsDelegate' protocol 
@interface Delegator : NSObject 
@property (weak) id<ReportsDelegate> delegate; 
@end 

Delegator.m

#import "Delegator.h" 

@implementation Delegator 
@synthesize delegate; 

// Override -init, etc. as needed here. 

- (void)generateNewReportWithData:(NSDictionary *)someData { 

    // Obviously, your report generation is likely more complex than this. 
    // But for purposes of an example, this works. 
    NSString *theNewReport = [someData description]; 

    // Since our delegate method is declared as optional, check whether the delegate 
    // implements it before blindly calling the method. 
    if ([self.delegate respondsToSelector:@selector(delegator:didCreateNewReport:)]) { 
     [self.delegate delegator:self didCreateNewReport:theNewReport]; 
    } 
} 

@end 
+0

我們不需要綜合de Delegator.m中的legate屬性? –

+0

哦,我們絕對會。我會解決這個問題。謝謝。 –

+0

玩了幾個小時後,我明白了一切,這要歸功於你的描述。非常感謝 :)。 –