1

セル アクセサリ タイプUITableViewCellAccessoryCheckmarkがチェックされているかどうかを確認するにはどうすればよいですか?

私のアプリUITableViewでは、UIAlertView. 私も使った

cell.accessoryType = UITableViewCellAccessoryCheckmark;

私のtableViewには、9行あります。ユーザーが最初の行をタップすると、2 行目を除くすべての行がチェックされます。ユーザーは、必要に応じて任意の行をチェックできます。ユーザーが 2 番目の行をタップすると、2 番目の行のみがチェックされます。

前もって感謝します :)

4

4 に答える 4

1

@dasblinkenlightの答えは確かにもっとエレガントですが、あなたには高度すぎるかもしれません。

本質は、どのセルがチェックされ、どのセルがチェックされていないかを追跡することです。何かが変更されたら、テーブルビューをリロードして、チェックマークを更新します。

これを追跡するには、独自の変数を作成する必要があります。ビットマップは非常に経済的でエレガントですが、理解するのが難しく、多数の行に拡張できない場合があります。または、配列を使用することもできます。

NSMutableArray *checkedArray = [NSMutableArray arrayWithObjects:
                   [NSNumber numberWithBool:YES],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   [NSNumber numberWithBool:NO],
                   nil];

インデックスパスを指定して行を変更するには:

[checkedArray replaceObjectAtIndex:indexPath.row 
                        withObject:[NSNumber numberWithBool:YES]]; //add

[checkedArray replaceObjectAtIndex:indexPath.row 
                        withObject:[NSNumber numberWithBool:NO]]; //remove

またcellForRowAtIndexPath、アクセサリを明示的に設定してください。

if ([[checkedArray objectAtIndex:indexPath.row] boolValue]) {
    cell.accessoryType = UITableViewCellAccessoryTypeCheckmark;
} 
else {
    cell.accessoryType = UITableViewCellAccessoryTypeNone;
}
于 2012-08-25T11:44:04.937 に答える
1

アイテムの数が非常に少ないため、1 つの整数とビットマスクを使用して、チェック済み/未チェックの状態をモデル化できます。数値の下位 9 ビットを使用して、チェック済み/未チェックの状態を示します。

// Add an instance variable to your view controller
// Initialize to 0 in the designated initializer
NSUInteger checkedFlags;

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *res = ... // Dequeue the cell and so on

    res.accessoryType = (checkedFlags & (1 << indexPath.row))
    ?    UITableViewCellAccessoryCheckmark
    :    UITableViewCellAccessoryNone;

    ... // The rest of the method
}

個々の行をチェック/チェック解除/トグルする方法tableView:willSelectRowAtIndexPath:は次のとおりです。デリゲートの で、次のいずれかを実行します。

checkedFlags |= (1 << indexPath.row); // Check
checkedFlags &= ~(1 << indexPath.row); // Uncheck
checkedFlags ^= (1 << indexPath.row); // Toggle

一度に複数の行をチェック/チェック解除する場合は、バイナリ形式でチェック/チェック解除する行に対応するビットで構成される番号でマスクします。たとえば、ビット 2..8 が設定されている番号は です0x01FC0

checkedFlags |= 0x1FC0; // Check rows #3 through #9

変数reloadDataを操作した後に呼び出すことを忘れないでください。checkedFlags

于 2012-08-25T10:39:29.053 に答える
0

これはすでに回答されていることは知っていますが、NSMutableIndexSet インスタンスを維持し、チェックされた/チェックされていない行のインデックスを追加/削除することに多くの幸運がありました。

主な方法:

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSInteger index = indexPath.row;
    cell.accessoryType = ([self.selectedRowsIndexSet containsIndex:index]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    cell.textLabel.text = [NSString stringWithFormat:@"Row %d",index];

    return cell;
}

これはかなり簡単です。インデックスが選択されているかどうかを確認し、それに応じてアクセサリを設定します。

複数選択 (つまり、任意の呼び出しを選択できる) の実装では、tableView:didSelectRowAtIndexPath:次のようになります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger index = indexPath.row;
    if ([self.selectedRowsIndexSet containsIndex:index])
        [self.selectedRowsIndexSet removeIndex:index];
    else
        [self.selectedRowsIndexSet addIndex:index];

    [tableView reloadRowsAtIndexPaths:@[ indexPath ] withRowAnimation:UITableViewRowAnimationAutomatic];
}

インデックスを追加して、テーブルをリロードするだけです。単一の選択の場合、それもかなり高速です

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSInteger oldIndex = [self.selectedRowsIndexSet firstIndex];
    NSInteger newIndex = indexPath.row;
    [self.selectedRowsIndexSet removeIndex:oldIndex];
    [self.selectedRowsIndexSet addIndex:newIndex];
    [tableView reloadRowsAtIndexPaths:@[ indexPath, [NSIndexPath indexPathForRow:oldIndex inSection:0] ]
                     withRowAnimation:UITableViewRowAnimationAutomatic];
}

もちろん、いくつかのセクションでの選択が他のセクションでの選択に依存するかどうかなど、より多くのセクションでより複雑になる可能性があります。前者にはインデックス セットのセクションごとの配列を使用し、後者には基礎となるデータ モデルを含むさまざまな複雑なロジックを使用してきました。ただし、基本的なテーブル ビューの対話を単にインデックス セットのクエリのレベルに保つことで、これらのメソッドをかなり短く読みやすくすることができます。

于 2012-08-26T22:15:35.423 に答える
0
if ([[tableView cellForRowAtIndexPath:indexPath ] accessoryType] == UITableViewCellAccessoryCheckmark){

}
else{ 

}
于 2012-08-25T12:04:37.220 に答える