※ ChatGPTを利用し、要約された質問です(原文:iphoneでTableViewに動的追加できない)
iPhoneでTableViewに動的追加できない
このQ&Aのポイント
iPhoneでUITableViewを使ってWebから取得した情報を表示しようとしていますが、非同期にセルを追加することができません。
テストアプリを作成していますが、初期状態が空欄の場合や挿入時のアニメーションに関して問題が発生しています。
(1)の初期値設定や(5)のセクション表示に関連してエラーが発生しているようです。
iphoneでTableViewに動的追加できない
UITableViewでWebから取得した情報を表示したく、非同期にCellを追加する
テストアプリを書いていたのですが、わからない点がいくつかあります。
以下は非同期追加のテストコードで、実行するとリストに"foo"が一件だけ表示され
2秒おきにリストに”bar”が追加されます。
@interface AddRowTableViewController : UITableViewController {
NSMutableArray *dataSouce;
}
-(void)onTimer:(NSTimer*)timer;
@end
@implementation AddRowTableViewController
- (void)viewDidLoad
{
// 初期値は空欄
dataSouce = [[NSMutableArray alloc] init]; // (1)
// 初期値としてfooを持つ
//dataSouce = [[NSMutableArray alloc] initWithObjects:@"foo", nil]; // (1)'
// 2秒ごとにbarを追加するためにインターバルタイマをセット
[NSTimer scheduledTimerWithTimeInterval:2.0f
target:self
selector:@selector(onTimer:)
userInfo:nil
repeats:YES];
}
// 2秒ごとに挿入のために呼ばれる
-(void)onTimer:(NSTimer*)timer
{
// barを追加
[dataSouce addObject:@"bar"];
[self.tableView beginUpdates];
NSIndexPath* path = [NSIndexPath indexPathForRow:0 inSection:0]; // (2)
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:path] withRowAnimation:UITableViewRowAnimationTop];
[self.tableView endUpdates]; // (3)
[self.tableView reloadData]; // (4)
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [dataSouce count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *id = @"default-cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:id];
if(!cell){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:id];
[cell autorelease];
}
cell.textLabel.text = [dataSouce objectAtIndex:indexPath.row];
return cell;
}
#if 0 // (5)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if([dataSouce count] > 0)
return 1;
else
return 0;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
// テストなので、聞かれたらTitleと答えておく
return @"title";
}
#endif
@end
このプログラムは一応動作するのですが、少し変えると期待通りに動作しません。
疑問1
コード中の(1)をコメントアウト及び(1)’をコメントインした状態で、初期値として
"foo"が画面に表示された状態からスタートするようになりますが、このとき
(2)で先頭に挿入するように記載していますが、実際には2行目に挿入されます。
foo
bar
bar
例えば4秒後にはこんな感じに並びます。なぜでしょうか?
疑問2
(4)のコードを書くと挿入時にアニメーションしません。(4)のコードを書かないとbarではなく
fooが追加されたように見えます。スクロールしてフレームアウト/インなどの動作が
あるとセルがリロードされ正しくbarになります。
挿入アニメーションを有効にしつつ最新データを参照させるにはどうしたらよいのでしょうか?
疑問3
(5)を#if 1とすることでセクションが表示されるようになりますが、このときに
初期値として何かあれば追加できますが、初期状態が空欄の場合に追加できず
(3)のコードがSIGABRTを発行してしまいます((1)だとNG、(1)’だと通る)。
空欄のセクション付きリストにCellを挿入するにはどうしたらよいでしょうか?
経験が浅く、非常識なコードになっているのではないかと思いますが、
どうにも自力ではこれ以上進めなくなってしまいました。
上記1~3の一つでもいいので、なにかヒントをいただけないでしょうか?
未検証のカンによるアドバイスも歓迎です、こちらで検証させて頂きます。
どうかよろしくお願い致します。
お礼
丁寧にコードを読んでいただいてありがとうございます! ご指摘いただいた修正で完璧に動作しました。本当にありがとうございます! Appleのドキュメントを読むことを怠ったのが最大の問題ですね。 今後は読むようにします。