2012-01-24 20 views
4

私のアプリにはバグがあり、セルの内容をリセットしていないため、私はそれを信じています。リンゴのドキュメントとは'リセット'テーブルビューのセルの内容

テーブルビューのデータソースの実装であるtableView:cellForRowAtIndexPath:は、セルを再利用する際に常にすべてのコンテンツをリセットする必要があります。

誰かがこれを行う方法やチュートリアルを教えてください。前もって感謝します!

マイcellForRow

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    static NSString *identifier = @"Cell"; 

    cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease]; 

     addBtn = [[UIButton alloc]init]; 
     addBtn =[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [addBtn setFrame:CGRectMake(220,10,25,55)]; 
     [addBtn addTarget:self action:@selector(addLabelText:) forControlEvents:UIControlEventTouchUpInside]; 
     [addBtn setTitle:@"+" forState:UIControlStateNormal]; 
     [addBtn setEnabled:YES]; 
     [cell addSubview:addBtn]; 

     subBtn = [[UIButton alloc]init]; 
     subBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [subBtn setFrame:CGRectMake(260,10,25,55)]; 
     [subBtn addTarget:self action:@selector(subtractLabelText:) forControlEvents:UIControlEventTouchUpInside]; 
     [subBtn setTitle:@"-" forState:UIControlStateNormal]; 
     [subBtn setEnabled:YES]; 
     [cell addSubview:subBtn]; 

    } 
    //cellText.hidden=!self.editing; 
    cell.textLabel.textColor = [UIColor orangeColor]; 
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; 
    cell.imageView.image = [imageArray objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [number objectAtIndex:indexPath.row];// <------ Is this line in the right place? 
    cell.textLabel.text = @"1"; // <---- Is this line in the right place? 


return cell; 
} 
+0

あなたのルーチンルックスをOK。 "number"はNSString *の配列ですか?もしそうでなければ、おそらくあなたが死んでいるところです。 cell.textLabel.textフィールドにNSStringオブジェクトを配置する必要があります。 –

答えて

2

それはかなり簡単です。あなたは、あなたのコードにcellForRowAtIndexPathという呼出しを提供します。その中で、新しいセルを提供するか、OSがメモリにチャッキングしたセルを再利用します。基本的には、コードは次のようになります。

コメントの下の部分は、セルの内容をリセットする必要がある場所です。それは新しいセルまたはリサイクルされたセルのいずれかである可能性があるため、情報もリサイクルされた別のセルの情報もありません。どちらの場合でも、セルのテキストとアクセサリ、およびセルが呼び出されるたびに使用するその他のものを指定します。基本的には、新しいセルとリサイクルされたセルのどちらかを提供するコールバックです。インデックスパスに基づいてセルの正しい情報を埋めなければなりません。私はこれを十分に明確にしたいと思っています。

+0

ああ、私はあなたを理解したと思うよ。コメントの下にあるセルのテキストを設定するコードがある場合、同じindexPathにある場合は新しいセルに追加されますか?助けてくれてありがとう! – iProRage

+0

このように考える必要があります:cellForRowAtIndexPathは、要求に応じてセルをリストに与える、あなたが提供するメソッドです。新しいセル(cell = [[UITableViewCell alloc] ...)を作成するか、ユーザーがリストをスクロールしたときにリストからスクロールされたセルを再利用します(リストはこれらを追跡し、 dequeueReusableCellを使用して...)。いずれの場合も、要求された索引パスのセルの正しいテキストをプラグインします。私の例では、pickerData配列のテキストを使用しましたが、NSString *はこれを行います。また、チェックマークのアクセサリーも使用しています。 –

+0

@owenHarnett、セルテキストを新しいものにしたい場合は 'if'ステートメントの下に置いてください。また、もし私が 'textLabel'セルを変更し、新しいラベルのテキストを配列に格納すると、ここでセルのテキストをどこに設定すべきですか?私は 'if'ステートメントの下でそれを行うことができないので、または私はできますか?私を助けてください!私はとても混乱しています!私はすでにドキュメントを読んでいて、まだまだ混乱しています!上記の質問に私の 'cellForRow'メソッドを投稿してください。どうもありがとうございました!! – iProRage

1

あなたがそれらを洗浄するために次のことを行う必要があり、セルにプログラムでビューを追加する場合:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"CellID";  
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];   
    } 

    for (UIView * v in cell.contentView.subviews) {   
     [v removeFromSuperview] 
    } 

    //Configure your cell 

    return cell; 
} 
+0

'if'ステートメントで' removeFromSuperView'コードをどうやって取得できますか?彼らが表示される前に、これは単にビューを削除するだろうか? – iProRage

1

は、以下のコード内のコメントを参照してください...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"CellID";  
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     // this is where you want to configure your generic cell 
     // for example, if EVERY cell needs to have a disclosure indicator, you could do 
     cell.accessoryType = UITableViewAccessoryTypeDisclosurseIndicator;  
    } 

    // this is where you want to put code that would or could be unique to a cell 
    // for example, if you wanted to put the row number you could do: 
    cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row]; 
    // you would put this here and not in the above if statement because the value of the textLabel changes for different cells 

    return cell; 
} 
+0

私はコードをどこに置くべきか理解していますが、セルの内容を「リセット」するためのステートメント/コードがわからないので、助けてくれてありがとう!! – iProRage

関連する問題