web-dev-qa-db-ja.com

[UITableView reloadData]とは何ですか?

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
}
22
Dutchie432

健全性チェックとして、その時点でtheTableがnilでないことを確認しましたか?

29
smorgan

ReloadData呼び出しに遅延を設定することもできます-セルを並べ替えるときにテーブルビューを更新しようとしたときに同様の問題が発生しましたが、reloadDataを呼び出しているとアプリがクラッシュしました。

したがって、このようなものは試してみる価値があります:

更新方法:

    - (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

そして、(たとえば)0.5秒の遅延で呼び出します:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

それがうまくいくことを願っています...

12
h4xxr

ディスパッチされたメソッド内から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];
        }); 
}
6
nooitaf

ReloadDataを呼び出す前に、メッセージ配列に正しい内容が含まれていることを確認するために、refreshメソッドにブレークポイントを設定してみましたか?

0