iPhone:UITableView CellAccessory复选标记

在iPhone应用程序单击表格视图单元格我想要显示表格视图单元格附件types复选标记为didSelectRowAtIndexPath上我写代码

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

并显示复选标记。

但在我的情况下,我必须允许用户一次只检查单元格意味着如果用户select其他行,那么该行应该检查,以前检查应该是未选中

我怎样才能做到这一点?

跟踪一个实例variables,检查哪一行。 当用户select一个新行时,首先取消先前选中的行,然后检查新行并更新实例variables。

这里是更多的细节。 首先添加一个属性来跟踪当前选中的行。 如果这是一个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; } } 

参考看看这个讨论

这是一个简单的解决scheme,为我工作:

在你的.h文件中声明:

 NSIndexPath *checkedCell; 

然后在你的.m文件中添加:

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

cellForRowAtIndexPath方法和

 checkedCell = indexPath; [tableView reloadData] 

didSelectRowAtIndexPath方法。

祝你好运!

我研究了你的问题,并得到了一个解决scheme

在.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; } 

我希望这可以帮助你…

这很简单

在.h

 NSIndexPath checkedCell; 

在.m

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

在didSelectRowAtIndexPath中

 checkedCell = indexPath; [tableView reloadData] 

您可以将检查行的NSIndexPath作为类variables存储,无论何时只要使用存储为类variables的NSIndexPathvariables访问先前检查过的行,并取消选中该行,就可以将其存储。

检查下面的post

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

我希望这个解决你的问题:

 - (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]; } 

添加到您的UITableViewDataSource委托variablesNSIndexPath *checkedIndex 。 添加到didSelectRowAtIndexPath:

 checkedIndex = indexPath; [tableView reload]; 

并更改您的cellForRowAtIndexPath:方法:

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