Question

iPhone UITableView cells stay selected

in my UITableView sometimes cells stay selected after touching. Because it happens only occasionally, I'm not able to reproduce the problem.

Any hints? Maybe it has something to do with unproper releasing of 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;   
}
   }
 45  26906  45
1 Jan 1970

Solution

 96

I can't tell you why you're seeing the issue, but here are some suggestions for fixing it:

According to the Apple HIG, the selection should not disappear until returning from the view controller just pushed onto the stack. If your controller is just a UITableViewController, it should deselect automatically upon returning to the view. If not, add

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

somewhere in the view controller.

If there are any rows that, when clicked, do not go to another view, and don't in fact do anything when selected, they shouldn't be selectable, so you can override that in

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

and return nil in the cases that the row should not be selected.

2009-05-22

Solution

 21

One possible cause is overriding -viewWillAppear:animated: without calling [super viewWillAppear] in a controller that extends UITableViewController. Adding [super viewWillAppear:animated] at the beginning of your -viewWillAppear method may rectify the problem.

2011-07-16