我正在使用 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
任何人都可以指出问题可能是什么?
是否有更简单的方法在两个控制器之间传递数组的值
答案 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
函数中的。它将按预期工作