视图是否可以了解其控制器?

时间:2012-02-27 04:33:34

标签: objective-c model-view-controller nsnotificationcenter

我希望我的控制器能够从视图订阅通知。但是,在此之前,我想确认是否可以让视图知道其控制器的实例?

让我为您提供一个更具体的例子。

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

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是处理特定视图内容的私有方法。

一切正常,不过,我想知道这种方法在道德上是否可以接受

3 个答案:

答案 0 :(得分:4)

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

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

object参数实际上是由接收器使用来区分它应该关注哪些通知。最常见的是,论证是海报本身:

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

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

注册通知时,您可以指定您感兴趣的通知的特定实例。这是object的{​​{1}}参数通知中心将仅传递名称<的通知em>和对象匹配指定的内容。

即使您为addObserver:...中的nil传递了object,也可以检查收到的通知的对象,只有在海报是您感兴趣的海报时才会行动。< / p>

例如,您的应用程序中可能有多个窗口,您可能有兴趣了解其中一个窗口的大小调整,但您不关心其余部分的情况。您只需将该窗口实例作为addObserver:...

object传递

总而言之,在这种情况下,您的视图 不需要对其控制器的引用,以便控制器接收视图发布的通知。

另请参阅:"Posting Notifications"

答案 1 :(得分:2)

虽然这个概念没问题,但在你的情况下并不需要:

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

NSNotification引用的对象通常是发布通知的对象。整个通知的想法是海报不需要了解观察者。

答案 2 :(得分:1)

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