gpt4 book ai didi

objective-c - NSNotification postNotificationName 在 AppDelegate 中,但 NSNotificationCenter 在 ViewController 中?

转载 作者:行者123 更新时间:2023-12-03 16:44:37 29 4
gpt4 key购买 nike

我无法在 NSNotificationCenter 中执行选择器方法 receiveChatText,我想知道问题是否是因为 NSNotification postNotificationName 位于 AppDelegate.m 中,但 NSNotificationCenter 位于 ViewController.m 中? IE。 postNotificationName 可以知道 NSNotificationCenter 位于另一个 viewController 文件中还是我需要告诉它?

在 viewController.m 中我有

 -(id)init
{
self = [super init];
if(self){
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveChatText:)
name:ChatMessageReceived
object:nil];
return self;
}

- (void)receiveChatText:(NSNotification *)note {
NSLog(@"received chat text");

}

在顶级 AppDelegate.m 文件中,我有以下内容:

 -(void) didReceiveMessage {
[[NSNotificationCenter defaultCenter] postNotificationName:ChatMessageReceived
object:nil
userInfo:nil];
}

有什么想法可以阻止调用 didReceiveMessage 时执行 receiveChatText 吗?

最佳答案

I can't get the selector method, receiveChatText, …

首先,它是带有冒号的receiveChatText:。这在 Objective-C 中很重要 —receiveChatText:receiveChatText 不引用相同的方法。

其次,“选择器”的含义并不像您想象的那样。选择器是方法的名称。您传入希望通知中心发送给观察者的消息的选择器。也就是说,您告诉通知中心“当此通知到达时,向我 [ View Controller ] 发送一条 receiveChatText: 消息”。

… in the NSNotificationCenter …

通知中心没有 receiveChatText: 方法。您的观察者 (self) 会这样做,这就是您希望通知中心将消息发送到的原因。

… to execute and I am wondering if the problem is because the NSNotification postNotificationName is in AppDelegate.m …

AppDelegate.m 中没有这样的东西。

应用程序委托(delegate)发布通知。

… but NSNotificationCenter is in ViewController.m?

ViewController.m 中没有这样的东西。

View Controller 观察通知。

只要 View Controller 在应用程序委托(delegate)发布通知之前将自身添加为观察者,这就会起作用。如果不起作用,则说明其中一个或两个步骤未发生,或者发生的顺序错误。

I.E. can the postNotificationName know that the NSNotificationCenter is in another viewController file or is that something I need to tell it?

通知中心不在这两个文件中。 [NSNotificationCenter defaultCenter] 是一个单例对象,在整个应用程序中所有想要使用它的对象之间共享。这就是您如何使用它来让应用程序委托(delegate)与 View Controller 以及正在观察通知的任何其他对象进行通信。

您正在向默认通知中心发送一条 postNotificationName:object:userInfo: 消息。这与您之前发送 addObserver:selector:name:object: 消息的默认通知中心相同。只要您先开始观察,然后将通知发送到同一个通知中心,通知中心就能将通知发送给您添加的观察者。

Any ideas what could stop receiveChatText

接收聊天文本:

from being executed when didReceiveMessage is called?

  1. didReceiveMessage 未发布通知。假设您在问题中显示的代码是准确的,但事实并非如此。
  2. View Controller 未观察通知。既然它开始观察创造,也许它还没有被创造。或者,可能是因为您覆盖了 init 而不是 NS/UIViewController 的 initWithNibName:bundle:。了解不同类的指定初始值设定项是什么;文档通常会说。
  3. View Controller 尚未观察通知:您在 View Controller 开始观察通知之前(即在创建 View Controller 之前)发布了通知。

您可能还希望将聊天文本作为通知的对象传递,或者在其 userInfo 中传递,而不是强制通知的所有观察者从未指定的源检索它。

关于objective-c - NSNotification postNotificationName 在 AppDelegate 中,但 NSNotificationCenter 在 ViewController 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577255/

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