iOS NSN通知简单Xcode项目问题

iOS NSN通知简单Xcode项目问题,ios,nsnotificationcenter,nsnotifications,Ios,Nsnotificationcenter,Nsnotifications,我现在正在学习通知编程,有一个非常简单的项目,有两个类有一些小问题,发布通知时不调用通知选择器方法。这太奇怪了,希望有人能帮我找到哪里出了问题,我很感激 我的源代码: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIButton *pushButton; - (IBAction)

我现在正在学习通知编程,有一个非常简单的项目,有两个类有一些小问题,发布通知时不调用通知选择器方法。这太奇怪了,希望有人能帮我找到哪里出了问题,我很感激

我的源代码:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIButton *pushButton;

- (IBAction)presentViewController:(id)sender;

@end
ViewController2.h

#import <UIKit/UIKit.h>

@class ViewController;

@interface ViewController2 : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *testLabel;
@property (nonatomic, strong) ViewController *viewController;

@end
您有两个问题:

您在任何人注册接收通知之前发布通知。 添加观察者时,您将筛选到未发布通知对象的实例:self.viewController。 1。通知不会被存储,只有在发布通知时附加的观察者才会收到通知

两个人。通知可以与对象一起发布,并且观察者可以对该对象进行筛选。如果对象不匹配,将不会调用该方法。如果不想进行任何过滤,请在观察时将对象设置为nil

交换视图控制器演示文稿和通知发布的顺序:

ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];

    [self presentViewController:viewController2
                   animated:YES
                   completion:^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
                                                    object:nil];
}
您有两个问题:

您在任何人注册接收通知之前发布通知。 添加观察者时,您将筛选到未发布通知对象的实例:self.viewController。 1。通知不会被存储,只有在发布通知时附加的观察者才会收到通知

两个人。通知可以与对象一起发布,并且观察者可以对该对象进行筛选。如果对象不匹配,将不会调用该方法。如果不想进行任何过滤,请在观察时将对象设置为nil

交换视图控制器演示文稿和通知发布的顺序:

ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];

    [self presentViewController:viewController2
                   animated:YES
                   completion:^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
                                                    object:nil];
}

我在你的代码中发现了两个问题

一,

此处您正在发布通知,然后显示ViewController2,此处您发送了通知,但在当前时间点没有可用的接收器。所以什么也不会发生

检查:

- (IBAction)presentViewController:(id)sender
{
    ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
    [self presentViewController:viewController2
                       animated:YES
                     completion:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
                                                        object:self];
}
二,

为什么要再次分配ViewController


只需从presentViewController:method传递它。

我在您的代码中发现了两个问题

一,

此处您正在发布通知,然后显示ViewController2,此处您发送了通知,但在当前时间点没有可用的接收器。所以什么也不会发生

检查:

- (IBAction)presentViewController:(id)sender
{
    ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
    [self presentViewController:viewController2
                       animated:YES
                     completion:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
                                                        object:self];
}
二,

为什么要再次分配ViewController



只需从presentViewController:method传递它。

为什么要传递self作为对象,似乎在发送方和接收方都可以使用nil?您确定presentViewController甚至被调用了吗?@DCS123,因为我以前以通知发送方的身份传递了ViewController实例。@AaronGolden No,未被调用,所以这就是发生的问题,我不知道出了什么问题?你能帮我找出这有什么问题吗?为什么你要传递self作为对象,似乎nil在发送方和接收方都可以,你确定presentViewController甚至被调用了吗?@DCS123,因为我以前是作为通知发送方传递ViewController实例的。@AaronGolden No,没有被调用,所以这就是发生的问题,我不知道出了什么问题?你能帮我找出这有什么问题吗?虽然OP可能不需要过滤,但在我看来,他实际上在两种情况下都使用了相同的对象,所以这并不是阻止通知通过的原因。OP最新评论的问题是,发布通知的方法根本没有被调用。两个控制器之间存在循环,因此很难判断对象是否相同。我想不是。啊,你是对的,好吧。我打赌OP并不意味着在viewDidLoad中创建一个全新的视图控制器。我可以理解将sender对象设置为nil,但为什么要在任何人注册接收通知之前发布通知?对不起,我不明白。我该如何修改它?谢谢!我知道你为什么在显示viewController和发布通知之间对调用顺序进行swop的原理。尽管OP可能不需要过滤,但在我看来,他实际上在这两种情况下使用了相同的对象,所以这并不是阻止通知通过的原因。OP最新评论的问题是,发布通知的方法根本没有被调用。两个控制器之间存在循环,因此很难判断对象是否相同。我想不是。啊,你是对的,好吧。我打赌OP并不意味着在viewDidLoad中创建一个全新的视图控制器。我可以理解将sender对象设置为nil,但为什么要在任何人注册接收通知之前发布通知?对不起,我不明白。我该如何修改它?谢谢!我已经知道了为什么您在演示viewController和发布通知之间对呼叫顺序进行swop的原则。谢谢!我明白你的意思,但我该怎么办
在任何人注册接收该项目后发布通知?@Andy_24:我不理解你的评论。无论如何,无法检查是否有可用的侦听器。对于这种情况,我在上面添加了一个建议。请检查一下,我不确定它是否有效谢谢!我理解你的意思,但是在任何人注册接收到这个项目的通知后,我应该怎么做才能发布通知?@Andy_24:我不理解你的评论。无论如何,无法检查是否有可用的侦听器。对于这种情况,我在上面添加了一个建议。请检查一下,我不确定它是否有效
- (IBAction)presentViewController:(id)sender
{
    ViewController2 *viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"viewController2"];
    [self presentViewController:viewController2
                       animated:YES
                     completion:nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"networkNotification"
                                                        object:self];
}
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.viewController = [[ViewController alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(recievingNotifications:)
                                                 name:@"networkNotification"
                                               object:self.viewController];
}