2012-02-29 71 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对象一样)

相关问题