行を選択するとチェックマークが表示されるUITableView
があります。問題は、didSelectRowAtIndexPath
の行を選択し、選択した行にチェックマークを追加すると、チェックマークが追加されることです。これが私のコードです
どんな助けでも大歓迎です。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
// Configure the cell...
cell.textLabel.text=[[Model.category objectAtIndex:indexPath.row] categoryName];
cell.imageView.image=[[Model.category objectAtIndex:indexPath.row]categoryImage];
//cell.detailTextLabel.text =@"Breve Descripción de la categoria";
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if ([self.tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark) {
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType =UITableViewCellAccessoryNone;
[self.cellSelected removeObject:indexPath];
}else {
[tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
[self.cellSelected addObject:indexPath];
}
[self checkMark];
[tableView reloadData];
}
- (void)checkMark{
for (NSIndexPath * indexPath in self.cellSelected) {
[self.tableView cellForRowAtIndexPath:indexPath].accessoryType=UITableViewCellAccessoryCheckmark;
}
}
[self.tableView cellForRowAtIndexPath:indexPath]
didSelectRowAtIndexPath
を呼び出すと、正確なセルは返されません。同じセルでも、新しいセルでも、再利用されたセルでもかまいません。アクセサリビューで再利用されたセルにチェックマークが付いている場合、チェックマークの付いたセルが2つあります。
配列に格納し、それに応じて使用することをお勧めします。複数の選択肢がある場合は、以下のコード例を使用してください。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.cellSelected = [NSMutableArray array];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//Cell Initialisation here
if ([self.cellSelected containsObject:indexPath])
{
cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else
{
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//if you want only one cell to be selected use a local NSIndexPath property instead of array. and use the code below
//self.selectedIndexPath = indexPath;
//the below code will allow multiple selection
if ([self.cellSelected containsObject:indexPath])
{
[self.cellSelected removeObject:indexPath];
}
else
{
[self.cellSelected addObject:indexPath];
}
[tableView reloadData];
}
これを試して:
.mファイルで宣言します。
@interface MyViewController () {
NSIndexPath *__selectedPath;
}
tableView:cellForRowAtIndexPath:
指定されたindexPathがivarに保存されているものと同じかどうかを確認します。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//configure cell
if ([__selectedPath isEqual:indexPath]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}
return cell;
}
tableView:didSelectRowAtIndexPath
選択されたNSIndexPathへのポインタを格納するか、セルが選択解除されている場合はnil
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (cell.accessoryType == UITableViewCellAccessoryNone) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
__selectedPath = indexPath;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
__selectedPath = nil;
}
}
私はXcodeをチェックインせずにそれを書いたので、タイプミスがあるかもしれませんが、私は主なアイデアを示しています。私の意見では、[self checkMark];
あなたのtableView:cellForRowAtIndexPath:
方法。
さらに、一度に1つのセルのみを選択する場合は、NSMutableArray
を作成してNSIndexPath
を格納しないでください。あなたのcellSelected
は一度に2 NSIndexPaths
を格納しているようです。そのため、この奇妙な振る舞いをしています。