gpt4 book ai didi

objective-c - View 了解其 Controller 是否可以?

转载 作者:行者123 更新时间:2023-12-04 02:43:31 25 4
gpt4 key购买 nike

我希望我的 Controller 订阅来自 View 的通知。但是,在此之前,我想确认 View 是否可以知道其 Controller 的实例?

让我举一个更具体的例子来说明我的想法。

我的 Controller 创建 View 并通知它它是它的 Controller

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

完成后,它会订阅来自该 View 的通知

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

与此同时 View 执行它的操作,但是当正确的时间到来时,它会发布通知

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

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

我想借此机会和您谈谈以下是否可以:

initWithController被调用时, View

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

其中 initWithFrame:CGRectMake 是处理特定 View 内容的私有(private)方法。

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

最佳答案

如果 View 引用了它的 Controller ,严格来说这不是问题,但看起来你真正的问题是对通知发布方法的误解。

object 参数不是接收者。事实上,如果它是——如果通知的发布者必须知道将要收到通知的对象——那将破坏通知的全部目的。您可以调用适当的方法!通知的意义在于张贴者不需要知道正在收听的其他对象。

object 参数实际上被接收者用来区分它应该关心的通知。最常见的是,争论是海报本身:

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

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

注册通知时,您可以指定一个特定的实例,其通知您感兴趣。这是 addObserver:...object 参数 通知中心然后将仅传递那些名称​​和对象与指定内容匹配的通知。

即使您在 addObserver:... 中为 object 传递了 nil,您也可以检查收到的通知的对象,并且只如果海报是您感兴趣的,请采取行动。

例如,您的应用程序中可能有多个窗口,您可能想知道其中一个窗口何时调整大小,但您不关心其余窗口发生了什么。您只需将该窗口实例作为 addObserver:...

object 传递

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

另请参阅:"Posting Notifications"

关于objective-c - View 了解其 Controller 是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9460106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com