1

したがって、initでNSNotificationServiceにオブザーバーとして自分自身を追加し、deallocでNSNotificationCenterから自分自身を削除するクラスがあります。

すべてがうまく機能します。通知を投稿して、正しいオブジェクトで一度受信します。

次に、ループを実行して3つのビューを追加しました。各ビューは一度initと呼ばれ、すべてのビューがオブザーバーとして追加されました。

これで、通知を投稿すると、各ビューが3回通知を受け取ります。(合計9)

そこで、addオブザーバーを別のメソッドに移動し、2つのビュー(これら3つから)でのみ呼び出しました。

これで、各ビューが2回呼び出されました(3回のビューが2回呼び出され、合計6回)が、3番目のインスタンスはオブザーバーとして追加されていません(メホトを監視し、期待どおりに呼び出されませんでした)。

ここで、ループを削除して3つのビューを作成しました。そして、オブザーバーとして1つだけ追加しました。3つすべてが呼び出されました...

これは既知の問題ですか、それとも何か新しいものを見つけましたか?

XCode 4.6 iOS 6.1

アップデート - - - - - - - -

問題は、私のビューが実際には1つのインスタンスにすぎないことです。

このコードは、すべて同じ1つのビューである3つのビューを生成します。

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は、定義されたフレームのサブビューを割り当てて追加する単なるメソッドです。

4

3 に答える 3

0

オブザーバーを追加する前に、毎回オブザーバーを削除してください。明らかに複数回追加されています

于 2013-03-15T09:23:57.490 に答える
0

問題の根本は次のとおりです。

ループ内に、、の3つのインスタンスを作成し、それらをに追加hw1しましhw2た。hw3[contentScrollView addSubview:

つまり、contentScrollViewには合計9つのサブビューがあり、それぞれに独自のオブザーバーがあります。

そのため、通知は9回監視されます。

于 2013-03-15T09:40:37.413 に答える
0

ループはここにありました:

ビューAを作成し、データからの呼び出しを監視するように設定すると、Aはデータに更新するように指示しました。

これで、ビューBもオブザーバーとして設定され、データに更新するように指示されました。

最終的に、データは3回更新するように指示され、更新されてからすべてのオブザーバーに新しいデータ(3回)が通知され、他のビュー用のデータを受け取ったため、ビューはすべて同じように動作しました(結局同じインスタンスではありません)。

于 2013-03-15T09:52:27.363 に答える