2

カスタム UITableViewCellAccessoryCheckmark が必要なテーブル ビューがあります。チェックマークは行が選択されると表示され、別の行が選択されると消え、最後に最も選択されたビューに表示されます。それはうまくいきます。

この行を使用すると問題が発生します。

 cell.accessoryView = [[ UIImageView alloc ]
                            initWithImage:[UIImage imageNamed:@"icon-tick.png" ]];

カスタム UITableViewCellAccessoryCheckmark を追加します。そのコードの後、 UITableViewCellAccessoryCheckmark はすべての行に残り、別の行に触れても消えません。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

int index = indexPath.row; id obj = [listOfItems objectAtIndex:index];

   UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

NSLog(@"%d",indexPath.row);
if (rowNO!=indexPath.row) {
    rowNO=indexPath.row;
    [self.tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;

    cell.accessoryView = [[ UIImageView alloc ]
                            initWithImage:[UIImage imageNamed:@"icon-tick.png" ]];

    [self.tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone;
    lastIndexPth=indexPath;
}
4

2 に答える 2

8

よりクリーンでクールな方法は、次のように UITableViewCell を上書きすることです。

- (void)setAccessoryType:(UITableViewCellAccessoryType)accessoryType
{
    // Check for the checkmark
    if (accessoryType == UITableViewCellAccessoryCheckmark)
    {
        // Add the image
        self.accessoryView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"YourImage.png"]] autorelease];
    }
    // We don't have to modify the accessory
    else
    {
        [super setAccessoryType:accessoryType];
    }
}

それを行っていればUITableViewCellAccessoryCheckmark、クラスが自動的に画像に置き換えるため、引き続き使用できます。

メソッドでのみスタイルを設定する必要がありますcellForRowAtIndexPath。このような:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // [init subclassed cell here, dont forget to use the table view cache...]

    cell.accessoryType = (rowNO != indexPath.row ? nil : UITableViewCellAccessoryCheckmark);

    return cell;
}

そして、次のように、データを更新rowNOdidSelectRowAtIndexPathてセルを再描画するために更新する必要があります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (rowNO != indexPath.row)
    {
        rowNO = indexPath.row;
    }

    [self.tableView reloadData]; 

}

また、 を使用して表全体を再ロードする代わりに[self.tableView reloadData]、スタイル (チェックマークなど) を変更する 2 つのセルのみを を使用して再ロードすることもできますreloadRowsAtIndexPaths

于 2013-01-17T15:36:09.480 に答える
3

うーん、理由はわかりませんが、コメントを追加できないので、これを回答として書いています。Blauesockeの回答の問題は、AccessoryType が UITableViewCellAccessoryCheckmark に設定されないため、セルの AccessoriesType を確認できないことです。それを正しく行う方法はありますか?それにより、セルの AccessoriesType は正しいタイプの別の画像になります。

私はこのような方法を使用しています:

- (void)setAccessoryType:(UITableViewCellAccessoryType)newAccessoryType
{
    [super setAccessoryType:newAccessoryType];
    // Check for the checkmark
    switch(newAccessoryType)
    {
        case UITableViewCellAccessoryCheckmark:
            self.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"yorCheckmark.png"]];
            break;
        case UITableViewCellAccessoryNone:
            self.accessoryView = nil;
            break;
        default:
            break;
    }

}
于 2013-01-18T13:23:04.173 に答える