4

私はこれを機能させようとしていますが、そのアイデアに頭を悩ませているようには見えません。

これまでのところ、セルを選択してチェックマークを付けることができるようになりました。次に、別のセルを選択すると、前のチェックマークが消え、選択したばかりの新しいセルにテーブルビューが新しいチェックマークを付けます。これはすべて美しく機能します。

ただ、同じセルをチェックマークで選択するとチェックマークが消えないところにしたいです。しかし、そうです!

これを機能させる方法を理解できるかどうかを確認するために、多数の if ステートメントを試しましたが、解決策はわかりません。コードで再配置する必要があるのは、おそらく些細なことです。

これが私のコードです:

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

    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                                        cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
        [tableView deselectRowAtIndexPath:indexPath animated:YES];

    }

    if([self.checkedIndexPath isEqual:indexPath])
    {
        self.checkedIndexPath = nil;
    }

    else
    {
         cellCheck = [tableView cellForRowAtIndexPath:indexPath];
        cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;
        self.checkedIndexPath = indexPath;
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
        NSLog(@"%@", indexPath);

    }
}
4

2 に答える 2

12

チェックマークのあるセルを選択すると、このコードが実行されます。

if(self.checkedIndexPath)
{
    UITableViewCell* uncheckCell = [tableView
                                     cellForRowAtIndexPath:self.checkedIndexPath];
     uncheckCell.accessoryType = UITableViewCellAccessoryNone;
     [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

このコードは、最初の選択時に追加したチェックマークを削除します。

次に、このコードが実行されます

if([self.checkedIndexPath isEqual:indexPath])
{
    self.checkedIndexPath = nil;
}

したがって、同じセルを再度選択した場合にのみ、チェックマークが再表示されます

よりクリーンな方法は次のようになると思います。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell* cellCheck = [tableView
                                    cellForRowAtIndexPath:indexPath];
    cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell* uncheckCell = [tableView
                                    cellForRowAtIndexPath:indexPath];
    uncheckCell.accessoryType = UITableViewCellAccessoryNone;
 }

AS [tableView indexPathForSelectedRow]; から self.checkedIndexPath の値を取得できます。self.checkedIndexPath の設定は、コードのロジックによってはオプションです。

于 2012-11-03T23:42:30.183 に答える
0

そのようにセルを直接操作するのではなく、チェックされた状態をどこかに保存し、cellForRowAtIndex のアクセサリタイプを変更します。

static BOOL checkedRows[100]; // example data storage

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
{
    checkedRows[indexPath.row] = !checkedRows[indexPath.row];
    [tableView reloadData];
}

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

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"somecell"];

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

    cell.accessoryType = checkedRows[indexPath.row] ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

    return cell;
}
于 2012-11-03T23:43:38.150 に答える