iPhone UITableView单元保持选定状态

在我的UITableView有时单元格保持选中后触摸。 因为它只是偶尔发生,所以我不能重现这个问题。

任何提示? 也许这与不正确的释放tableView有关吗?

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSUInteger row = [indexPath row]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; switch (row) { case 0: FruitViewController *fruitController = [FruitViewController alloc]; [fruitController retain]; [fruitController initWithNibName:@"FruitView" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:fruitController animated:YES]; [fruitController release]; break; case 1: CerealsViewController *cerealsController = [CerealsViewController alloc]; [cerealsController retain]; [cerealsController initWithNibName:@"CerealsView" bundle:[NSBundle mainBundle]]; [self.navigationController pushViewController:cerealsController animated:YES]; [cerealsController release]; break; default: break; } } 

我不能告诉你为什么你看到这个问题,但这里有一些修复它的build议:

根据苹果HIG,select不应该消失,直到从刚刚推入堆栈的视图控制器返回。 如果你的控制器只是一个UITableViewController,它应该在返回到视图时自动取消select。 如果不是,请添加

 - (void) viewWillAppear:(BOOL)animated { [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:animated]; [super viewWillAppear:animated]; } 

在视图控制器的某处。

如果有任何行被点击,不要去另一个视图,实际上没有做任何事情,它们不应该是可选的,所以你可以覆盖

 - (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath 

并且在不应该select该行的情况下返回nil

一个可能的原因是覆盖-viewWillAppear:animated:在一个扩展UITableViewController的控制器中没有调用[super viewWillAppear] 。 在您的-viewWillAppear方法的开始处添加[super viewWillAppear:animated]可能会纠正问题。

为了扩大“Ed Marty”的答案,我select在“viewWillDisappear”方法中添加取消select,因为我认为它看起来更好。

除此之外,我正在使用UITableView与常规UIViewController(而不是UITableViewController),所以tableViewvariables不可用。 为了克服这个我在我的视图控制器头文件(并在我的XIB文件中,我连接到实际的表视图属性)添加一个tableView属性…

 @property (nonatomic,retain) IBOutlet UITableView *tableView 

…在视图控制器实现连接属性,并执行取消select如下。

 @synthesize tableView - (void) viewWillDisappear:(BOOL)animated { [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated]; [super viewWillDisappear:animated]; } 

如果你使用的是UITableViewController,你可以使用:

 self.clearsSelectionOnViewWillAppear = YES; 

在我的情况下,我取消selectdidSelectRowAtIndexPath结束处的单元格:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // Do smth here. segue ..etc [tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:NO]; } 

在你的UITableViewCell类中使用这个方法

 (void)setSelected:(BOOL)selected animated:(BOOL)animated { // Just comment This line of code // [super setSelected:selected animated:animated]; } 

或者甚至可以在didSelectRowAtIndexPath方法中尝试此代码

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

//select行时做一些事情

 [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

}

一旦学习了如何pipe理表格,解决这个问题大约需要两秒钟的时间。

一旦细胞在屏幕上滚动,他们就失去了格式。 该表通过closures其他单元并在用户回滚时重新创build它们来最小化其内存使用。

甚至像重新加载表格数据这样的事情,那个时候真的只适用于屏幕上的单元格。 要指出的是,cellForRowAtIndexPath可能会创build同一个单元格五次而不需要用户点击button或者离开视图控制器! 所以设置它来重新加载任何格式。 像这样添加到cellForRowAtIndexPath:

  if arrayOf_SelectedCells.contains(indexPath) { setup_Selected(cell) //Where setup_Selected is a custom function to apply formatt } else { setup_Unselected(cell) }