2012-02-29 73 views
2

場景,在紙牌遊戲中:是否可以將數據作爲NSNotifications的一部分傳遞?

用戶在屏幕上移動卡片。作爲移動的結果,卡的座標改變。如果發現卡位於某個特定位置,我們希望確保Card對象(模型)已更新以包含這些座標。

但視圖不應該直接交談模型..,所以

而是直接更新卡,查看將要通知其控制器,「卡已經登陸」。在收到這個通知,我想對於一個控制器來更新卡的位置,而不是視圖(控制器更新模型)

問題1: 我在想這種類型的場景是否正確?

問題2: 是否可以將數據發送到控制器以及通知?

回答

2

對於您的場景,您不需要NSNotifications:基於代理的直接方法應該可以。

該視圖應該定義委託接口,並提供非保留delegate屬性。控制器應該實現委託接口,並將自己設置爲視圖的委託。該視圖然後會通知其代表甚至不知道它通知控制器。控制器然後將通知傳遞給模型。

@protocol CardDelegate 
-(void)cardHasLanded:(SOCard*)card atPosition:(SOPosition*)pos; 
@end 

@interface MyView 
@property (weak, nonatomic,readwrite) id<CardDelegate> delegate; 
@end 

@implementation MyViewController 
-(id)init { // This should be in your designated initializer 
    self = [super init]; 
    if (self) { 
     MyView *view = [[MyView alloc] init]; 
     view.delegate = self; 
     self.view = view; 
    } 
    return self; 
} 
-(void)cardHasLanded:(SOCard*)card atPosition:(SOPosition*)pos { 
    // Update the model 
} 
@end 

@implementation MyView 
@synthesize delegate; 
-(void) doSomething { 
    // ... 
    if (cardHasLanded) { 
     [delegate cardHasLanded:card atPosition:pos]; 
    } 
    // ... more code 
} 
@end 
+0

優秀的響應。謝謝 – JAM 2012-02-29 15:33:47

+0

在你的例子中,控制器是否需要實現協議?看起來不像,但我想確保 – JAM 2012-03-01 03:40:56

+1

雖然委託方法也是一種標準設計模式,並且在這裏肯定非常有用,但通知方法的優點是可以很容易地讓新的觀察者對操作做出響應。例如,一個想要做統計的對象也可以觀察到通知,發送方不需要進行任何更改。使用委託模式,它不會那麼容易,並且可能會產生更緊密的耦合。人們需要將其更改爲偵聽器模式,而不是保持鬆散耦合。 – DarkDust 2012-03-01 08:40:08

2

這就是userInfo字典和objectNSNotification用於。在這種情況下,它是你想要的object。例如:

// In your model header file 

extern NSString * const CardMovedNotification; 

// In your model implementation file 

NSString * const CardMovedNotification = @"CardMoved"; 

... 

[[NSNotificationCenter defaultCenter] postNotificationName:CardMovedNotification object:theCardThatMoved]; 

然後你的觀察者可以通過[notification object]獲得該卡。如果你需要傳遞更多的信息,你可以創建一個字典,並通過userInfo,通過postNotificationName:object:userInfo:。觀察者然後可以通過[notification userInfo]查詢它。

0

我同意不需要通知。通常對於UI對象座標,我不會使用模型對象,因爲座標是耦合到UI對象的(否則您將在哪裏繪製它?)。你需要做的就是將你的控制器註冊到通過UI對象傳遞的觸摸結束事件,並在更新(在響應控制器方法中)對象的座標,如果他們確實在所需的位置。 (與按鈕和其他UI對象一樣)

相關問題