NSNotificationCenter将所有实例添加为观察者

时间:2013-03-15 09:19:05

标签: iphone ios xcode nsnotificationcenter

所以我有一个类在init上的NSNotificationService中将自己添加为观察者,而dealloc将自己从NSNotificationCenter中删除。

一切都很好,我发布通知并接收一次并使用正确的对象。

然后我做了一个循环并添加了三个视图。每个视图都被称为init一次,所有视图都将自己添加为观察者。

现在,当我发布通知时,每个视图都会收到三次通知! (总共9个)

所以我将我的添加观察者移动到另一个方法并仅在两个视图(从这三个视图)调用它。

现在每个视图都被调用两次(三次视图被调用两次,总共6次)虽然第三个实例甚至没有被添加为观察者(观看了metgod,没有按预期调用)。

现在我删除了循环并创建了三个视图。并且只添加了一个作为观察者。这三个人都被称为......

这是已知的问题还是我找到了新的东西?

XCode 4.6 iOS 6.1

UPDATE ---------------

问题是,我的视图实际上只是一个实例。

此代码生成三个视图,它们都是同一个视图。

CustomViewController * hw1 = [[CustomViewController alloc] init];

    [hw1 setupWithFrame:CGRectMake(
                                contentScrollView.frame.size.width * 0 + contentScrollView.frame.size.width/2 - 250 ,
                                contentScrollView.frame.size.height / 2 - 250,500,500)];

    [contentScrollView addSubview:hw1.view];

CustomViewController * hw2 = [[CustomViewController alloc] init];

[hw2 setupWithFrame:CGRectMake(
                               contentScrollView.frame.size.width * 1 + contentScrollView.frame.size.width/2 - 250 ,
                               contentScrollView.frame.size.height / 2 - 250,500,500)];

[contentScrollView addSubview:hw2.view];

CustomViewController * hw3 = [[CustomViewController alloc] init];

[hw3 setupWithFrame:CGRectMake(
                               contentScrollView.frame.size.width * 2 + contentScrollView.frame.size.width/2 - 250 ,
                               contentScrollView.frame.size.height / 2 - 250,500,500)];

[contentScrollView addSubview:hw3.view];

更改hw1中的内容,更改hw2和hw3中的内容。

SetupWithFrame只是一个分配和添加已定义帧的子视图的方法。

3 个答案:

答案 0 :(得分:0)

每次在添加观察者之前移除观察者。 它显然被多次添加

答案 1 :(得分:0)

以下是问题的根源:

您在循环中创建了hw1hw2hw3的三个实例,并将其添加到[contentScrollView addSubview:

因此,您的contentScrollView现在总共有9个子视图,每个子视图都有自己的观察者。

这就是为什么你的通知会被观察九次。

答案 2 :(得分:0)

解决了这个问题。也很简单。

循环在这里:

当我创建一个视图A并将其设置为观察来自Data的调用时,A告诉Data要更新。

现在视图B也被设置为观察者并告诉数据更新。

最后,数据被告知要更新三次,并且自更新以来它告诉所有观察者有关新数据(三次)和所有视图都采取相同的行动(毕竟不是同一个实例),因为他们收到的数据是其他观点。

感谢闪电帮助!你的问题解决了地雷。