2012-05-08 102 views
17

在我的一些學習中,我看到有人提到,在你的視圖控制器中,你可以有一個模型,並且在模型上有一些監聽器來改變它。我認爲我沒有爲這些使用正確的名稱,這可能是爲什麼我的搜索沒有發現任何東西。基本上我想將我的服務器調用從控制器移到我的模型中,但我需要某種監聽器來了解何時調用完成以更新視圖。iOS:Objective-C中的事件偵聽器的等效物是什麼?

+0

Apple查看[此文檔](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html)。 – dasblinkenlight

回答

19

考慮代表 delegates tutorial

或塊多一點先進 basic blocks tutorial

剛開始與代表,

你也可以使用NSNotification NSNotification tutorial但不推薦,因爲它們傳播到每一個類,你可能只需要發送消息到特定的類別不是每一個

+1

我相信我讀的是關於NSNotification,我傾向於這個的原因是因爲我希望模型不知道或不理解正在聆聽的內容。當我在其他地方實現代理時,我需要知道委託,以便可以調用其中的特定方法。 在這種情況下,我想建立模型來廣播它已完成,因此無論哪個視圖可能正在偵聽,都可以以適合該特定視圖的任何方式進行操作。 – Jhorra

+0

第一個鏈接斷開 –

+0

@IspasClaudiu更新了謝謝 – MaKo

0

我認爲您可能正在尋找NSNotificationCenter,它可以將消息傳遞給任何可能正在收聽的人。因此,您可以發送模型中事件的通知,並在您的控制器中監聽它。更清潔的方法可能是與代表一起實施自己的協議。

12

屬於C#世界,我必須去目標c(對於我的工作)。 我認爲事件等同的目標C是這樣實現:

與您的所有事件的方法創建協議:

@protocol MyDelegate <NSObject> 
    - (void)myEvent; 
@end 

在你的類,它應該發送的情況下,添加:

@interface MyClassWichSendEvent : NSObject 

@property (nonatomic, retain) IBOutlet id<MyDelegate> delegate; 

@end 

例如:舉辦活動,例如:

- (IBAction)testEvent:(NSButton*)sender 
{ 
    [self.delegate myEvent]; 
} 

現在,在監聽器類,你應該聽的事件是這樣的:

協議添加到您的類,聽

@interface Document : NSDocument<MyDelegate> 

在實現中,對init或在界面生成器,你必須鏈接委託你的對象實例要傾聽你自己的類。

在代碼

-(void)awakeFromNib 
{ 
    myObjToListen.delegate = self;  
} 
  • 在Interface Builder - > IBOutlet中從委託到你聽的課。

最後,實現你的方法,你的監聽器類:

- (void)myEvent 
{ 
    NSLog(@"i have listen this event !"); 
} 

對不起,我的英語,我希望幫助的人誰從Java或C#去了。

+0

我不明白你怎麼稱呼myEvent在一個ID?因爲我看到的是代表是IBOutlet ID 。你能詳細解釋一下嗎?謝謝 –