我希望我的控制器能够从视图订阅通知。但是,在此之前,我想确认是否可以让视图知道其控制器的实例?
让我为您提供一个更具体的例子。
我的控制器创建视图并通知它它是它的控制器
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
是处理特定视图内容的私有方法。
一切正常,不过,我想知道这种方法在道德上是否可以接受
答案 0 :(得分:4)
如果视图具有对其控制器的引用,则严格来说不是问题,但看起来您真正的问题是对通知发布方法的误解。
object
参数不是接收者。实际上,如果是 - 如果通知的海报必须知道将要获得通知的对象 - 这将破坏通知的整个目的。你可以调用适当的方法!通知的要点是海报不需要知道正在收听的其他对象。
object
参数实际上是由接收器使用来区分它应该关注哪些通知。最常见的是,论证是海报本身:
[[NSNotificationCenter defaultCenter] postNotificationName:IDidSomethingInteresting
object:self];
但它实际上可以是任何对象。
注册通知时,您可以指定您感兴趣的通知的特定实例。这是object
的{{1}}参数通知中心将仅传递名称<的通知em>和对象匹配指定的内容。
即使您为addObserver:...
中的nil
传递了object
,也可以检查收到的通知的对象,只有在海报是您感兴趣的海报时才会行动。< / p>
例如,您的应用程序中可能有多个窗口,您可能有兴趣了解其中一个窗口的大小调整,但您不关心其余部分的情况。您只需将该窗口实例作为addObserver:...
object
传递
总而言之,在这种情况下,您的视图 不需要对其控制器的引用,以便控制器接收视图发布的通知。
答案 1 :(得分:2)
虽然这个概念没问题,但在你的情况下并不需要:
[[NSNotificationCenter defaultCenter] postNotificationName:@"SaySomethingClever"
object:self];
NSNotification
引用的对象通常是发布通知的对象。整个通知的想法是海报不需要了解观察者。
答案 2 :(得分:1)
我会专注于控制器调用其他控制器(或理想的模型方法) 允许每个视图使用它的主要资源,并允许该视图的控制器进行其他调用。