场景,在纸牌游戏中:是否可以将数据作为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