UITableView selected cell doesn't stay selected when scrolled

Had the same problem, selected cell's accessoryView disappeared on scroll. My co-worker found pretty hack for this issue. The reason is that in iOS 7 on touchesBegan event UITableView deselects selected cell and selects touched down cell. In iOS 6 it doesnt happen and on scroll selected cell stays selected. To get same behaviour in iOS 7 try:

1) Enable multiple selection in your tableView.

2) Go to tableView delegate method didSelectRowAtIndexPath, and deselect cell touched down with code :

   NSArray *selectedRows = [tableView indexPathsForSelectedRows];
for(NSIndexPath *i in selectedRows)
{
    if(![i isEqual:indexPath])
    {
        [tableView deselectRowAtIndexPath:i animated:NO];
    }
}

Fixed my problem! Hope it would be helpful, sorry for my poor English btw.


I know my method is not very orthodox but seems to work. Here is my solution:

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if cell.selected {
        cell.selected = true
    } else {
        cell.selected = false
    }
}

You must implement all the methods you mentioned on your post as well (@soleil)


iOS 7/8 both deselect the cell when scrolling begins (as Alexander Larionov pointed out).

A simpler solution for me was to implement this UIScrollViewDelegate method in my ViewController:

 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
     NSInteger    theRow       = [self currentRowIndex]; // my own method
     NSIndexPath *theIndexPath = [NSIndexPath indexPathForRow:theRow inSection:0];
     [self.myTableView selectRowAtIndexPath:theIndexPath 
                                   animated:NO 
                             scrollPosition:UITableViewScrollPositionNone];
 }

This works because my viewController is the UITableView's delegate, and UITableView inherits from UIScrollView.