IPhoneアプリでテーブルビューセルのクリックでテーブルビューセルを表示したいアクセサリタイプdidSelectRowAtIndexPathのチェックマークを付けるコードを書いています
if(indexPath.row ==0)
{
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
}
チェックマークを表示します。
しかし、私の場合、ユーザーが一度にセルのみをチェックできるようにすることは、ユーザーが他の行を選択した場合、その行をチェックし、以前にチェックをはずすことを意味します
どうすればそれを達成できますか?
行がチェックされているインスタンス変数で追跡します。ユーザーが新しい行を選択したら、最初に以前にチェックした行のチェックを外し、次に新しい行をチェックしてインスタンス変数を更新します。
詳細はこちらです。最初に、現在チェックされている行を追跡するプロパティを追加します。これが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;
}
}
- (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
これは私のために働いたシンプルなソリューションです:
。hファイルで宣言:
NSIndexPath *checkedCell;
その後、.mファイルに追加:
if (checkedCell == indexPath) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
cellForRowAtIndexPathメソッドにand
checkedCell = indexPath;
[tableView reloadData]
didSelectRowAtIndexPathメソッドへ
幸運を祈ります!
簡単です
.hで
NSIndexPath checkedCell;
.mで
cellForRowAtIndexPath
if ([checkedCell isEqual:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
didSelectRowAtIndexPath
checkedCell = indexPath;
[tableView reloadData]
私はあなたの問題に取り組み、解決策を得ました
.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;
}
これがお役に立てば幸いです...
クラス変数として保存されたNSIndexPath
変数を使用して以前にチェックされた行にアクセスし、それをオフにすると、チェックされた行のNSIndexPath
をクラス変数として保存できます。
以下の投稿を確認してください
UITableViewDataSource
デリゲート変数に追加NSIndexPath *checkedIndex
。追加 didSelectRowAtIndexPath:
checkedIndex = indexPath;
[tableView reload];
そして、cellForRowAtIndexPath:
方法:
cell = .. // init or dequeue
if ([indexPath isEqualTo:checkedIndex])
{
cell.accessoryType=UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType=UITableViewCellAccessoryNone;
}
これがあなたの問題を解決することを願っています:
- (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];
}