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的NSIndexPath
variables访问先前检查过的行,并取消选中该行,就可以将其存储。
检查下面的post
我希望这个解决你的问题:
- (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; }