質問

通知を使用して、アプリの詳細ビューコントローラーからルートビューコントローラーにデータを渡します。これらのメソッドは、メモリ警告が発生するまで正常に動作します。

通知はメモリ警告の後に 2 回処理されます。

ユーザーが DetailViewController 内の行を選択すると、データを rootviewcontroller に返します。DidSelectRowAtIndexPath メソッドは 1 回だけ呼び出されますが、通知オブザーバーは 2 回呼び出されます。

DidReceiveMemoryWarning の通知を削除する必要がありますか?それともコードに何か他の問題があるのでしょうか?

関連するコードを投稿する

RootViewControllerのviewDidLoad

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

DetailViewController の DidSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSMutableDictionary *dictionary = [[[NSMutableDictionary alloc] init] autorelease];

    [dictionary setObject:selectedRow forKey:@"row"];
    [[NSNotificationCenter defaultCenter] postNotificationName:kSelectionNotificationName object:self userInfo:dictionary];

    [[self navigationController] popToRootViewControllerAnimated:YES];
}

助けていただきありがとうございます。

役に立ちましたか?

解決

私は iPhone 開発にはまったく慣れていませんが、これまでのところ気づいたことは、メモリ警告の後、didReceiveMemoryWarning メソッドのデフォルトの実装では、ビューが表示されていない場合はビューをアンロードすることです。

あなたの場合、ルートビューコントローラーが表示されないため、アンロードされていると思います。ルート ビュー コントローラーに戻ると、viewDidLoad メソッドが再度呼び出され、ビュー コントローラー インスタンス (それ自体はアンロードされず、ビューのみがアンロードされます) が通知センターに再度登録されます。

解決策は、初期化時に、デフォルトの init メソッドまたは initWithNibName:bundle: メソッド、または initWithCoder: 方法。

他のヒント

あなたが示唆しているように、通知を 2 回購読すると、通知を 2 回受け取ることになります。

おそらく、割り当て解除されたオブジェクトを再インスタンス化し、通知を再サブスクライブしていると考えられます。

通知を購読するブレークポイントを設定すると、おそらく 2 回ヒットすることになります。

アクセサーをオーバーライドして、そこで通知のサブスクライブを解除できます。または、KVO を使用して行うこともできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top