1

ユーザーがデータを追加および削除できる動的テーブルがあります。テーブルには買い物リストが表示されます。ショッピングが完了したら、ユーザーは目的のアイテムにチェックを入れ、チェックを外すこともできるはずです。accessorybutton を設定することでこれを実現しました。ただし、行を削除すると問題が発生します。セルは削除されますが、そのセルに添付されているアクセサリ ボタンは同じ状態のままです。

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
   {    
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; } else { cell.accessoryView = nil; 
   }
}
4

2 に答える 2

0

選択したアイテムを追跡する必要があります

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
  cell = [tableView cellForRowAtIndexPath:indexPath]; 
   if (cell.accessoryView == nil)
   {    
    cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
    [self.checkedIndexPaths addObject:indexPath];
   } 
   else { 
   cell.accessoryView = nil; 
   [self.checkedIndexPaths removeObject:indexPath];
   }

}   

編集

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

// Do other stuffs

cell.accessoryView = nil;

if ([self.checkedIndexPath containsObject:indexPath]) {
   cell.accessoryView= [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]]; 
  }  

}
于 2013-05-22T12:15:09.617 に答える
0

UITableViewは通常、 のインスタンスを再利用するためUITableViewCell、'-tableView:cellForRowAtIndexPath:メソッドがセルのすべての属性を適切に設定するようにする必要があります。そうしないと、古いデータが存続する可能性があります。私はこれがあなたの問題かもしれないと推測しており、あなたのコードを完全に見ていません。

したがって、次のようなものです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString*    cellIdentifier = @"TheCellIdentifier";
    UITableViewCell*    cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    ShoppingObject* shopping = [self.myShoppingList objectAtIndex:indexPath.row];
    UIImageView*    accessoryView = nil;

    if (shopping.isDone) {
        accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick_btn"]];
    }

    cell.accessoryView =  accessoryView;

    return cell;
}

再利用キャッシュから、または新しいキャッシュを作成することによって、セルを取得します。次に、データ モデルの状態をチェックして、その行で表されているオブジェクトのショッピングが完了したかどうかを確認し、ショッピングが完了した場合はイメージを取得します。ショッピングは行われておらず、accessoryView が作成されていないことに注意してください。そのため、ShoppingObject の状態がそのテーブル行で表されていても、そのセルの accessoriesView は正しく設定されます。

したがって、私がおそらくあなたの中で行うことは、-tableView:didSelectRowAtIndexPath:すべて-reloadDataが正しく更新されるようにテーブルの上に置くことです.

于 2013-05-22T11:43:50.127 に答える