我有一个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;
}
}
答案 0 :(得分:41)
[self.tableView cellForRowAtIndexPath:indexPath]
中的{p> didSelectRowAtIndexPath
来电不会返回确切的单元格。它可以是相同的细胞,新细胞或重复使用的细胞。如果它是附件视图中的重用单元格有复选标记,则最终会有两个带复选标记的单元格。
最好存储在数组中并相应地使用它。如果您计划进行多项选择,请使用下面的代码示例。
- (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];
}
答案 1 :(得分:4)
试试这个:
在您的.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:
。
此外,如果您希望一次只有一个选定的单元格,则不应创建NSMutableArray
来存储NSIndexPath
。您的cellSelected
似乎一次存储2个NSIndexPaths
,这就是您有这种奇怪行为的原因。