場景,在紙牌遊戲中:是否可以將數據作爲NSNotifications的一部分傳遞?
用戶在屏幕上移動卡片。作爲移動的結果,卡的座標改變。如果發現卡位於某個特定位置,我們希望確保Card對象(模型)已更新以包含這些座標。
但視圖不應該直接交談模型..,所以
而是直接更新卡,查看將要通知其控制器,「卡已經登陸」。在收到這個通知,我想對於一個控制器來更新卡的位置,而不是視圖(控制器更新模型)
問題1: 我在想這種類型的場景是否正確?
問題2: 是否可以將數據發送到控制器以及通知?
場景,在紙牌遊戲中:是否可以將數據作爲NSNotifications的一部分傳遞?
用戶在屏幕上移動卡片。作爲移動的結果,卡的座標改變。如果發現卡位於某個特定位置,我們希望確保Card對象(模型)已更新以包含這些座標。
但視圖不應該直接交談模型..,所以
而是直接更新卡,查看將要通知其控制器,「卡已經登陸」。在收到這個通知,我想對於一個控制器來更新卡的位置,而不是視圖(控制器更新模型)
問題1: 我在想這種類型的場景是否正確?
問題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
這就是userInfo
字典和object
NSNotification
用於。在這種情況下,它是你想要的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]
查詢它。
我同意不需要通知。通常對於UI對象座標,我不會使用模型對象,因爲座標是耦合到UI對象的(否則您將在哪裏繪製它?)。你需要做的就是將你的控制器註冊到通過UI對象傳遞的觸摸結束事件,並在更新(在響應控制器方法中)對象的座標,如果他們確實在所需的位置。 (與按鈕和其他UI對象一樣)
優秀的響應。謝謝 – JAM 2012-02-29 15:33:47
在你的例子中,控制器是否需要實現協議?看起來不像,但我想確保 – JAM 2012-03-01 03:40:56
雖然委託方法也是一種標準設計模式,並且在這裏肯定非常有用,但通知方法的優點是可以很容易地讓新的觀察者對操作做出響應。例如,一個想要做統計的對象也可以觀察到通知,發送方不需要進行任何更改。使用委託模式,它不會那麼容易,並且可能會產生更緊密的耦合。人們需要將其更改爲偵聽器模式,而不是保持鬆散耦合。 – DarkDust 2012-03-01 08:40:08