0

I have a iOS app that, in a nutshell, uses a UITableView and a few buttons to change out the contents of the table. I was getting an error earlier in the development regarding the number of rows being inconsistent before and after a reloadData call but then found out what I was doing incorrectly.

Now however I'm getting a report from a tester that his iPad 1 is crashing, and looking at the stack trace I can see that the same error, as described above, is happeing. But all other iPad 2 testers seem to work correctly and they are all using the same data sets to populate the tables.

Here is how I am populating the tableview:

[tableviewController.data removeAllObjects] //Delete the old data. Tableviewcontroller is the delegate for self.tableview
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

If anybody has any idea why this might be happening and could point it out I would really appreciate it.

編集:さらにいくつかの詳細。この問題について聞いた後、テスターに​​アプリのローカル コピーを削除してもらい、最新バージョンを取得してもらいました。さらに、彼と他のテスターは全員 iOS 5.1.1 を実行しているため、私が見る限り唯一の矛盾はハードウェアのバージョンです。しかし、これは意味がありません:/

4

1 に答える 1

1

私の考えは、なぜこれをしないのかということです:

[tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
[self.tableview performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];

古いものをクリアしてリロードしてから、新しいものを設定してリロードする必要はありません。

ただし、スレッドには注意が必要です。このコードはメインスレッド以外から実行されているようです。つまり、テーブルのデータソースがデータの設定と競合する可能性があります。別の方法は、次のようにメインスレッド全体を叩くことです。

dispatch_async(dispatch_get_main_queue(), ^{
    [tableviewController setData:[newDataSetArray mutableCopy]]; //Copy over a new dataset array
    [self.tableview reloadData];
});

しかし、私がかなり混乱しているtableviewControllerのは、リロードしているテーブルビューがself.tableview? selfと同じではありませんかtableviewController?

于 2012-10-12T10:08:31.197 に答える