-1

NSNoficationCenterを使用して、あるViewConrollerから別のViewConroller に配列の値を渡しています。

ViewControllerBViewController 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)

}

現在、このコードには 2 つの問題があります。

1) 通知は、ViewController B の viewDidLoad が 1 回呼び出された後にのみ送信されます。最初は機能しません。

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

誰でも問題が何であるかを指摘できますか?

2 つのコントローラー間で配列の値を渡す簡単な方法はありますか

4

4 に答える 4

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        

}

ReceiverViewControllerで...

-(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];

}
于 2013-02-02T01:36:48.477 に答える
0

これは、UIViewController をネストしてはならない典型的なケースです。ここでより良い方法で説明されていますhttp://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

(addChildViewController メソッドを使用して uiviewcontroller B をネストしていないと仮定します。)

ネストされたビューコントローラー B を使用する代わりに、UIView B を使用し、それをサブビューとして追加して、コントローラー A のビューを表示します。

ただし、viewControllerB の viewDidLoad/Appear の機能を実装するためのより良い方法を見つけ出す必要があります。

于 2013-02-01T22:54:05.413 に答える
0

1) 通知は、ViewController B の viewDidLoad が 1 回呼び出された後にのみ送信されます。最初は機能しません。

それは、その通知にオブザーバーを追加する場所だからです。以前に観察したい場合は、このコードを init メソッドに移動することを検討してください。

2) 機能し始めると、送信される通知は、呼び出されるたびに 1 ずつ増加します。

追加されたすべてのオブザーバーは削除されませんでした。したがって、これらのインスタンスはオブザーバーであり、処理を続けます。タスクが終了したら、オブザーバーを削除することを検討してください。

于 2013-02-01T23:18:23.033 に答える
0

viewdidLoad 関数は、ビューをプッシュまたはビューに追加するたびに呼び出されるためです。したがって、オブジェクトが通知センターに追加され、SecondViewController での通知呼び出しのカウントがインクリメントされるたびに、オブザーバーを追加するのに最適な場所は initWithnib 関数なので、コードを配置します

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

機能中initWithNibName。そして、それは期待どおりに動作します

于 2013-02-02T02:08:23.913 に答える