2

我想让我的控制器订阅来自视图的通知。但是,在这之前,我想确认一下如果可以查看其控制器的实例吗?视图可以知道其控制器吗?

让我为您提供一个更具体的例子,说明我的想法。

我控制器创建的视图,并通知它,这是它的控制器

self.gameView = [[GameView alloc] initWithController:self]; 

一旦完成,其认购的通知,从这一观点

[[NSNotificationCenter defaultCenter] addObserver:self 
            selector:@selector(saySomething:) 
            name:@"SaySomethingClever" object:nil]; 

同时认为做的事情,但是当正确的时间来临,它发布通知

[[NSNotificationCenter defaultCenter] postNotificationName: 
             @"SaySomethingClever" object:gvc]; 

为了我要做到这一点,该视图需要知道通知(gvc)的接收者。

我想利用这个机会和你是否以下是确定:

initWithController被调用时,视图

-(id) initWithController: (GameViewController*)g { 
    gvc = g; 
    return [self initWithFrame:CGRectMake(0, 0, 480, 300)]; 
} 

其中initWithFrame:CGRectMake是处理特定视图东西的私有方法。

一切工作正常,但是,我不知道这种做法是否在道德上是可以接受的

回答

4

如果视图有对其控制器的引用,这并不是严格的问题,但看起来你真正的问题是对通知发布方法的误解。

object参数不是接收器。事实上,如果它是 - 如果通知的海报必须知道将要获得通知的对象 - 那将会破坏通知的整个目的。你可以调用适当的方法!通知的要点是海报不需要需要知道正在监听的其他对象。

object参数实际上被接收方用于以区分它应该关心哪些通知。最常见的是海报本身:

[[NSNotificationCenter defaultCenter] postNotificationName:IDidSomethingInteresting 
                object:self]; 

但它实际上可以是任何对象。

当通知注册,您可以。指定一个特定的实例,其通知你感兴趣这是object参数addObserver:...然后通知中心将只通过对这些通知的名字并指定什么对象比赛。

即使你通过niladdObserver:...object,您可以检查收到通知的对象,如果海报是一个你感兴趣的只是行动。

例如,可能有几个窗口在你的应用程序中,你可能有兴趣知道其中一个是否调整大小,但你不关心其他人会发生什么。你只传递一个窗口实例为objectaddObserver:...

综上所述,您认为在这种情况下需要,以便参照其控制器的控制器接收发表的观点通知。

另请参阅:"Posting Notifications"

+0

优秀的答案乔希!谢谢 – JAM 2012-02-27 05:26:26

+0

很高兴有帮助!我写的时候会觉得有点ra ra。 – 2012-02-27 05:28:16

1

我将集中控制器调用其它控制器(或理想模型方法)。
允许每个视图使用其主要资源,并允许该视图的控制器进行其他调用。

2

虽然这个概念是确定的,它并不需要你的情况:

[[NSNotificationCenter defaultCenter] postNotificationName:@"SaySomethingClever" 
                object:self]; 

NSNotification引用的对象通常是对象,帖子的通知。整个通知的想法是,海报不需要知道观察员。

相关问题