Alternating accessoryView and accessoryType in UITableViewCell
Quick post about a problem I had today.
I’m writing an app for a client that has a checklist component. So a UITableViewCell is in an unchecked state, and then when the user hits it, it becomes checked.
I like the look of the UITableViewCellAccessoryCheckmark, so I’m using it, but I needed something when the cell is unchecked, so I’m using a png that has a circle.
I was having a problem that when the cell was unchecked and I tapped on it, nothing appeared to happen, although if I went to another screen and came back to that one the check box would show up. But, if the cell was checked and I tapped on it, the circle would show up. Here’s the code that fixed it:
1if ([rowShouldBeChecked:indexPath.row ]) { 2 cell.accessoryType
UITableViewCellAccessoryCheckmark;
3 cell.accessoryView
=nil;
//Without this, the accessory view will trump the
4checkmark
5}
else
{
6
//FIXME: - Alloc during scrolling is slow - this is slow if there are many rows
7
UIImageView
*imageView
= [[UIImageView
alloc]
initWithImage:self.uncheckedImage
];
8 cell.accessoryView
= imageView
;
9
[imageView release
];
10}
I had forgotten cell.accessoryView =nil; and without doing that, the accessoryType was getting set, but the accessoryView was still there, so the accessoryType never got a chance to show up.
Note that in this case, I’m allocing a new UIImageView for every row. As I’ve commented here, you shouldn’t do this if you have a lot of rows and scroll speed is important. This app has maybe 15 rows at a time, so I’m not worried about performance (but I might still go and reuse a pre-alloc’ed array of ImageViews just because it will bug me if I don’t).