これは私のiPhone開発の最初の試みですが、Webサービスから返されたデータを表示するUITableViewController
があります。[tableview reloadData]の前にUITableViewControllerのリロードモデル
私のAppDelegateでは、数秒ごとに呼ばれるタイマーをセットアップし、モデルをリロードします。私は同じオブジェクト参照を保持し、内容を更新するだけですので、現時点で表示されているUITableViewController
には同じオブジェクトがあります。
データはAppDelegateに更新され、私が呼ん:
[[(UITableViewController *)[self.navigationController topViewController] tableView] reloadData];
モデルは基本的にfile
オブジェクトのコレクションです。各file
オブジェクトにはいくつかのプロパティとフラグがあります。
現在のUITableViewController
が、各セルをfiles
の配列の順次インデックスにマップする1つのセクションを持つ単純なテーブルである場合、これは非常にうまくいきます。
しかし、file
の詳細を示すUITableViewController
のいずれかがあり、file
オブジェクトのフラグに応じて、2または3セクションが表示されます。私はここでこのロジックを入れている:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if ([[_file status] intValue] & DOWNLOADING) {
kIndexTransferSpeed = 1;
kIndexSettings = 2;
return 3;
} else {
kIndexSettings = 1;
kIndexTransferSpeed = -1;
return 2;
}
}
だから、このコントローラに、私の-tableView:cellForRowAtIndexPath:
はちょうどindexPath
に応じて、_file
オブジェクトからプロパティを表示します大きなif
文です。
この方法の問題は、このテーブルがデバイスに読み込まれているときに、実際にデバイスが再読み込みされていることがわかります。セクションのタイトルがしばらく点滅し、セルが表示されます。特に、リロード中にテーブルをスクロールしている場合。
私はこれらの方法に論理を当ててはいけないということをどこかで読んだことがあります。しかし、私は何をすべきですか?
私は、データビューモデルを作成し、データを- tableView:cellForRowAtIndexPath:
で消費する準備ができていることを考え、AppDelegateが[tableView reloadData]を呼び出す前に呼び出すことにしました。しかし、同じオブジェクトであり、データモデル上で何が変更されたのか分からないので、呼び出されるたびにこのビューモデル全体を再作成する必要があります。
ありがとうございます!それで、-viewWillAppear:NSMutableArrayの「ビューモデル」を作成し、AppDelegateがデータを更新するときに、変更のリストを作成してコントローラの-refreshModelを呼び出すことができました。選択された行あれは正しいですか? – leolobato
もちろん、あなたのモデルへのindexPathsは、indexPathsからあなたのポストアニメーションビューとは異なるアニメーションを作成する前に、あなたのビューへのindexPathsとは異なることに注意してください。それは動きの中で多くのものになることができるので、あなたの頭の周りにあなたの頭を包むためにしばらく時間がかかります。 –
私の主な問題は、再描画されているテーブルを見ることができ、performSelectorOnMainThread:withObject:waitUntilDone:でreloadDataを呼び出すことを解決したことでした。私のモデルの処理方法を変更する必要はありませんでした。 – leolobato