It looks like the label text is being set only when the label is created. Once the cell gets reused, the label is found (via viewWithTag: and no further work is done.
Change the form:
id nthPartOfMyModel = [self.fetchedResultsController objectAtIndexPath:indexPath];
UILabel *someLabel = (UILabel *)[cell viewWithTag:someTag];
if (!someLabel) {
someLabel = // alloc init, set model-invariant properties
someLabel.tag = someTag;
[cell addSubview:someLabel];
NSString *text = // string representation of some aspect of nthPartOfMyModel
someLabel.text = text;
}
To the following:
UILabel *someLabel = (UILabel *)[cell viewWithTag:someTag];
if (!someLabel) {
someLabel = // alloc init, set model-invariant properties
someLabel.tag = someTag;
[cell addSubview:someLabel];
}
id nthPartOfMyModel = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSString *text = // string representation of some aspect of nthPartOfMyModel
someLabel.text = text;
See the difference? We always dereference our model given the index path, and we always update our cell's subviews to represent our model, but we only build those subviews when we can't find them in the cell.
An important point in the above is "model-invariant" properties. In labels, often everything but the label.text is model-invariant -- the same no matter which modelItem we're talking about. But what if the frame or the very presence of a label depends on the model? No problem, just move that out of the create condition, like this:
UILabel *someLabel = (UILabel *)[cell viewWithTag:someTag];
if (!someLabel) {
someLabel = // alloc init, set model-invariant properties
someLabel.tag = someTag;
[cell addSubview:someLabel];
}
id nthPartOfMyModel = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSString *text = // string representation of some aspect of nthPartOfMyModel
someLabel.text = text;
// this label is only visible for some rows, say based on some BOOL in the model
someLabel.alpha = (nthPartOfMyModel.doWeNeedTheLabel)? 1.0 : 0.0;