Есть несколько ошибок, работающих вместе, чтобы доставить вам неприятности.
Для начала, я думаю, вы, возможно, предполагаете, что в ячейке многократного использования из резервной копии есть те же данные, что и при получении.назад.На самом деле это работает так: вы можете вернуть одну и ту же ячейку, но, вероятно, вы получите другую ячейку, которая остается сверху или снизу в зависимости от направления прокрутки.Поскольку ячейки выходят из поля зрения, они помечаются как повторно используемые в непредсказуемом порядке.Итак, удалите этот блок else
и переместите всю логику (кроме init
+ autorelease
за пределы блока if
). Таким образом, все, что вы действительно проверяете, это то, нужно ли выделять новую память.
Во-вторых, у вас есть == UITextAlignmentCenter
, вы, вероятно, хотите использовать =
В-третьих, математика, которую вы используете для расчета геометрии метки, является подозрительной. Кажется, вы загружаете изображениезатем использовать размер этого изображения и границы таблицы для динамического вычисления нового кадра метки. Я бы серьезно подумал о новом подходе к расчету этого кадра метки. Вы уверены , что это единственный способ, которым вы можетемне кажется, что ваша математика фрейма метки должна быть одинаковой каждый раз.
Я немного почистил ее, чтобы она была читабельной, и выложу ее ниже с комментариями, чтобы лучше проиллюстрировать то, что я пытаюсь сделатьНадеюсь, это поможет.
// initialize cell if need be
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
// setup the accessory
UIImage *indicatorImage = [UIImage imageNamed:@"indicator.png"];
cell.accessoryView = [[[UIImageView alloc] initWithImage:indicatorImage] autorelease];
// TODO: rewrite this
UIImage *image = [UIImage imageNamed:@"64x64.png"];
const CGFloat LABEL_HEIGHT = 25;
CGFloat x = image.size.width + 2.0 * cell.indentationWidth;
CGFloat y = 0.8 * (tableView.rowHeight - 1.7 * LABEL_HEIGHT);
CGFloat w = tableView.bounds.size.width - image.size.width - 4.0 * cell.indentationWidth - indicatorImage.size.width;
CGFloat h = LABEL_HEIGHT;
CGRect labelFrame = CGRectMake(x,y,w,h);
// build a label and use it as the content view
UILabel* topLabel = [[[UILabel alloc] initWithFrame:labelFrame] autorelease];
topLabel.textColor = [UIColor colorWithRed:0.25 green:0.0 blue:0.0 alpha:1.0];
topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0];
topLabel.font = [UIFont systemFontOfSize:20];
topLabel.textAlignment = UITextAlignmentCenter;
topLabel.text = [NSString stringWithFormat:[aboutArray objectAtIndex:[indexPath row]]];
topLabel.textAlignment = UITextAlignmentCenter;
[cell.contentView addSubview:topLabel];