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

我无法告诉你为什么你看到这个问题,但这里有一些解决它的建议:

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

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

视图控制器中的某处。

如果有任何行点击时不会转到另一个视图,并且实际上没有做任何选择,它们不应该是可选择的,因此您可以覆盖该行

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

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


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


为了展开“Ed Marty”的回答,我选择在“viewWillDisappear”方法中添加取消选择,因为我认为它看起来更好。

除此之外,我用UITableView和普通的UIViewController(而不是UITableViewController),所以tableView变量对我来说是不可用的。 为了克服这个问题,我在我的视图控制器头文件中添加了一个tableView属性(并且在我的XIB文件中,我将实际的表视图连接到属性)...

@property (nonatomic,retain) IBOutlet UITableView *tableView

...在视图控制器实现连接属性并执行取消选择,如下所示。

@synthesize tableView

- (void) viewWillDisappear:(BOOL)animated {
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];
    [super viewWillDisappear:animated];
}
链接地址: http://www.djcxy.com/p/60003.html

上一篇: iPhone UITableView cells stay selected

下一篇: What deselect selected cell when navigationController pops a view?