1

コード[tableViewreloadData]を実行したいのですが、別のクラスからデータをリロードしたいViewControllerに呼び出したい場合を除きます。

(注。reloadDataよりもテーブルビューをリロードするのに効果的なものがある場合は、チャイムを鳴らしてください)。

再読み込みするビューが「RootViewController」であり、現在「DetailViewController」にいるとすると、それを機能させるために何をする必要がありますか。

今の私の最善の試みは[RootViewController.tableViewreloadData]ですが、正しくありません。(エラーが発生します:.tokenの前に':'が必要です。

よろしく、@ norskben

4

2 に答える 2

9

通知またはプロトコルを使用できます。

通知の使用:

データの保存が終了した直後、メソッドから戻る前に通知を投稿します。このようなもの:

//通知を投稿します[[NSNotificationCenterdefaultCenter]postNotificationName:@ "DataSaved" object:nil];

テーブルを処理するコントローラーで、

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

    [self.tableView reloadData];

}

そのviewDidLoadメソッドに次のコードを追加して通知を登録します。

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

最後に、deallocメソッドの登録を解除して追加します

[[NSNotificationCenter defaultCenter] removeObserver:self];

プロトコルの使用:

以前のコントローラーが使用できるコールバックを使用してプロトコルの作成を開始します。

@protocol dataSavedDelegate
-(void)dataSaved;
@end

データの保存が完了したら:

[(id< dataSavedDelegate >)object dataSaved];

これで、以前のコントローラーでデリゲートメソッドを処理しdataSaved()ます。メソッドでは、テーブルをリロードします。

于 2010-01-27T17:35:30.533 に答える
1

DetailViewControllerでRootViewControllerインスタンスへの参照が必要です。DetailViewControllerでプロパティを宣言し、DetailViewControllerをインスタンス化するときに(RootViewControllerから)、次のように設定します。

// in RootViewController.m
detailController.rootController = self;
[self.navigationController pushViewController:...

次に、詳細コントローラからルートコントローラにアクセスできます。

[self.rootController.tableView reloadData];

もう1つの方法は、RootControllerをリロードして、RootControllerに通知をリッスンさせるときに、DetailViewControllerにカスタムNSNotificationを投稿することです。

もう1つの方法は、ユーザーがルートコントローラーに戻ったときにのみテーブルをリロードすることです(RootViewControllerのviewWillAppear:メソッドでリロードします)。画面に表示されていないテーブルをリロードするのはなぜですか?

于 2010-01-27T17:34:57.780 に答える