web-dev-qa-db-ja.com

iPhone:TableViewセルアクセサリーチェックマーク

IPhoneアプリでテーブルビューセルのクリックでテーブルビューセルを表示したいアクセサリタイプdidSelectRowAtIndexPathのチェックマークを付けるコードを書いています

if(indexPath.row ==0)
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
 }

チェックマークを表示します。

しかし、私の場合、ユーザーが一度にセルのみをチェックできるようにすることは、ユーザーが他の行を選択した場合、その行をチェックし、以前にチェックをはずすことを意味します

どうすればそれを達成できますか?

37
ios

行がチェックされているインスタンス変数で追跡します。ユーザーが新しい行を選択したら、最初に以前にチェックした行のチェックを外し、次に新しい行をチェックしてインスタンス変数を更新します。

詳細はこちらです。最初に、現在チェックされている行を追跡するプロパティを追加します。これがNSIndexPathである場合が最も簡単です。

@interface RootViewController : UITableViewController {
    ...
    NSIndexPath* checkedIndexPath;
    ...
}

...
@property (nonatomic, retain) NSIndexPath* checkedIndexPath;
...

@end

cellForRowAtIndexPathに次を追加します。

if([self.checkedIndexPath isEqual:indexPath])
{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else 
{
    cell.accessoryType = UITableViewCellAccessoryNone;
}

tableView:didSelectRowAtIndexPath:のコーディング方法は、必要な動作によって異なります。常に行をチェックする必要がある場合、つまり、ユーザーが既にチェックした行をクリックする場合は、次を使用します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Uncheck the previous checked row
    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                     cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
    }
    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    self.checkedIndexPath = indexPath;
}

ユーザーが行をクリックしてチェックを外せるようにするには、次のコードを使用します。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Uncheck the previous checked row
    if(self.checkedIndexPath)
    {
        UITableViewCell* uncheckCell = [tableView
                    cellForRowAtIndexPath:self.checkedIndexPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
    }
    if([self.checkedIndexPath isEqual:indexPath])
    {
        self.checkedIndexPath = nil;
    }
    else
    {
        UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        self.checkedIndexPath = indexPath;
    }
}
169
idz
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *newCell =[tableView cellForRowAtIndexPath:indexPath];
int newRow = [indexPath row];
int oldRow = [lastIndexPath row];
if (newRow != oldRow)
{
    newCell = [tableView  cellForRowAtIndexPath:indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;
    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone;
    lastIndexPath = indexPath;  
}
}

参考のため、これをご覧ください discussion

5
visakh7

これは私のために働いたシンプルなソリューションです:

。hファイルで宣言:

NSIndexPath *checkedCell;

その後、.mファイルに追加:

        if (checkedCell == indexPath) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
        } else { 
cell.accessoryType = UITableViewCellAccessoryNone; 
}

cellForRowAtIndexPathメソッドにand

checkedCell = indexPath;
[tableView reloadData]

didSelectRowAtIndexPathメソッドへ

幸運を祈ります!

3
Johnny Rockex

簡単です

.hで

NSIndexPath   checkedCell;

.mで

cellForRowAtIndexPath


if ([checkedCell isEqual:indexPath]) 

{
    cell.accessoryType = UITableViewCellAccessoryCheckmark;


} else
{ 
    cell.accessoryType = UITableViewCellAccessoryNone; 
}

didSelectRowAtIndexPath

checkedCell = indexPath;

[tableView reloadData]
2
Ramsakal

私はあなたの問題に取り組み、解決策を得ました

.hファイル内

int rowNO;
    NSIndexPath *lastIndexPth;

で。 mファイル

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"%d",indexPath.row);
    if (rowNO!=indexPath.row) {
        rowNO=indexPath.row;        
        [tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
        [tableView cellForRowAtIndexPath:lastIndexPth].accessoryType=UITableViewCellAccessoryNone;
        lastIndexPth=indexPath;
    }

これがお役に立てば幸いです...

2
Gypsa

クラス変数として保存されたNSIndexPath変数を使用して以前にチェックされた行にアクセスし、それをオフにすると、チェックされた行のNSIndexPathをクラス変数として保存できます。

以下の投稿を確認してください

http://www.iphonedevsdk.com/forum/iphone-sdk-development/24240-uitableviewcellaccessorycheckmark-one-checkmark-time.html

1
Jhaliya

UITableViewDataSourceデリゲート変数に追加NSIndexPath *checkedIndex。追加 didSelectRowAtIndexPath:

checkedIndex = indexPath;
[tableView reload];

そして、cellForRowAtIndexPath: 方法:

cell = .. // init or dequeue
if ([indexPath isEqualTo:checkedIndex])
{
    cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else
{
    cell.accessoryType=UITableViewCellAccessoryNone;
}
1
5hrp

これがあなたの問題を解決することを願っています:

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

int newRow = [indexPath row];
int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1;

if (newRow != oldRow)
{
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:
                                indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: 
                                lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone;
    lastIndexPath = indexPath;
}

[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
1