UITableViewを持つアプリケーションがあります。このUITableViewは、appDelegateに(プロパティとして)保持されているNSMutableArrayによって入力されます。これはメールウィンドウと考えることができます。サブクラス化されたUITableViewCellにメッセージをリストします。新しいメッセージが表示されたら、メッセージをダウンロードし、すべてのメッセージを保持するappDelegateのNSMutableArrayにデータを追加するすべてのコードを実行しました。このコードは正常に動作しています。
新しいメッセージがダウンロードされて配列に追加されたら、次のコードを使用してUITableViewを更新しようとしていますが、UITableViewのデリゲート関数が呼び出されません。
奇妙なことに、UITableViewを上下にスクロールすると、デリゲートメソッドが最終的に呼び出され、セクションヘッダーが変更されます(そのセクションのメッセージ数が表示されます)。彼らはリアルタイムで更新し、私のスクロールが更新をトリガーするのを待たないのではないですか?また、セクションに新しいセルが追加されることはありません!!
助けてください!!
APPDELEGATE CODE:
[self refreshMessagesDisplay]; //This is a call placed in the msg download method
-(void)refreshMessagesDisplay{
[self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO];
}
-(void)performMessageDisplay{
[myMessagesView refresh];
}
ITableViewControllerコード:
-(void) refresh{
iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate];
//self.messages is copied from appDelegate to get (old and) new messages.
self.messages=mainDelegate.messages;
//Some array manipulation takes place here.
[theTable reloadData];
[theTable setNeedsLayout]; //added out of desperation
[theTable setNeedsDisplay]; //added out of desperation
}
健全性チェックとして、その時点でtheTableがnilでないことを確認しましたか?
ReloadData呼び出しに遅延を設定することもできます-セルを並べ替えるときにテーブルビューを更新しようとしたときに同様の問題が発生しましたが、reloadDataを呼び出しているとアプリがクラッシュしました。
したがって、このようなものは試してみる価値があります:
更新方法:
- (void)refreshDisplay:(UITableView *)tableView {
[tableView reloadData];
}
そして、(たとえば)0.5秒の遅延で呼び出します:
[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];
それがうまくいくことを願っています...
ディスパッチされたメソッド内からreloadDataを呼び出す場合は、必ずメインキューで実行してください。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {
// hard work/updating here
// when finished ...
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self.myTableView reloadData];
});
});
..メソッド形式で同じ:
-(void)updateDataInBackground {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {
// hard work/updating here
// when finished ...
[self reloadTable];
});
}
-(void)reloadTable {
dispatch_async(dispatch_get_main_queue(), ^(void) {
[myTableView reloadData];
});
}
ReloadDataを呼び出す前に、メッセージ配列に正しい内容が含まれていることを確認するために、refreshメソッドにブレークポイントを設定してみましたか?