NSNotification未发送

时间:2013-02-01 22:40:05

标签: iphone ios objective-c nsarray nsnotificationcenter

我正在使用 NSNoficationCenter 将数组的值从一个 ViewConroller 传递给另一个。

ViewControllerB ViewController A

的子视图

ViewController A 我有一个方法,它接受一个数组作为参数,一旦方法接收到数组,我使用下面的代码来存储数组的值

-(void)gettingValueOfArray:(NSArray*)newArray{

 NSDictionary *storeArray = [NSDictionary dictionaryWithObjectsAndKeys:newArray,@"newArray", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"loadArray" object:self userInfo:storeArray];

}

ViewController B 中,我使用以下内容在 viewDidLoad

中接收通知
-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadArray:) name:@"loadArray" object:nil];

}

然后使用此方法保存数组的值

-(void)saveArray:(NSNotification *)notfication{

NSArray *saveValueOfArray = [notification userinfo]objectForKey:@"newArray"];

NSLog(@"The Value of the Notification Array is : %u", saveValueOfArray.count)

}

现在我对这段代码有两个问题。

1)只有在ViewController B中的viewDidLoad被调用一次后才会发送通知,它在第一次不起作用。

2)一旦开始工作,每次调用时发送的通知都会增加1

这是第4次调用通知时的控制台输出,它会继续调用它所调用的所有内容。

The Value of the Array is : 10
The Value of the Array is : 10
The Value of the Array is : 10
The Value of the Array is : 10

任何人都可以指出问题可能是什么?

是否有更简单的方法在两个控制器之间传递数组的值

4 个答案:

答案 0 :(得分:0)

这是为什么你不应该嵌套UIViewControllers的经典案例。这里以更好的方式解释http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

(假设您没有使用addChildViewController方法来嵌套uiviewcontroller B。)

不要使用嵌套的视图控制器B,只需使用UIView B,并将其添加为子视图即可查看控制器A的视图。

你必须想出一个更好的方法来实现viewControllerB的viewDidLoad / Appear的功能。

答案 1 :(得分:0)

  

1)只有在ViewController B中的viewDidLoad被调用一次后才会发送通知,它在第一次不起作用

那是因为那是在该通知中添加观察者的地方。如果您想稍早观察,请考虑将此代码移动到init方法中。

  

2)一旦开始工作,每次调用时发送的通知都会增加1

每个添加的观察者都没有删除。因此,这些情况继续是观察者和处理者。考虑在任务结束时删除观察者。

答案 2 :(得分:0)

你把UIViewController放在另一个UIViewController上是不对的,而且你的代码是一个“小”奇怪但很好......因为它周五和我心情愉快我将为你提供一个小例子发布通知。

发布ViewController ...

-(void)gettingValueOfArray:(NSArray*)newArray{

NSDictionary *storeArray = 
[NSDictionary dictionaryWithObjectsAndKeys:newArray,@"newArray", nil];

[self postNotification:@"loadArray" withObject:storeArray];//calls postNotification

    }

-(void)sendNotification:(NSNotification *)notification{

        [[NSNotificationCenter defaultCenter] postNotification:notification];
        [notification release];

}

-(void)postNotification:(NSString *)notification withObject:(id)obj{

NSNotification *n = [NSNotification notificationWithName:notification object:obj];
[n retain];
[self performSelectorOnMainThread:@selector(sendNotification:) withObject:n waitUntilDone:NO];//calls sendNotification on the main thread        

}

在Receiver ViewController上......

-(void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(performDataLoad:)name:@"loadArray" object:nil];

}

//NOTE: if you want to receive only one notification at your ViewController B then remove the observer here

-(void)saveArray:(NSNotification *)n{

NSArray *saveValueOfArray = [[n object]objectForKey:@"newArray"];

NSLog(@"The Value of the Notification Array is : %u", saveValueOfArray.count)

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"loadArray" object:nil];


}

//Another NOTE: If you want multiples notifications then remove the observer once you are done with the class (i suppose that you in some point remove the subview) 

-(void)viewDidDisappear:(BOOL)animated{

[super viewDidDisappear:animated];

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"loadArray" object:nil];

}

答案 3 :(得分:0)

由于每次在视图上推送或添加视图时都会调用viewdidLoad函数。 因此,每次将对象添加到通知中心并在SecondViewController上增加通知调用的计数 因此,添加观察者的最佳位置是initWithnib函数 所以把你的代码

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadArray:) name:@"loadArray" object:nil];
initWithNibName函数中的

。它将按预期工作