Ячейки iPhone UITableView застряли и перепутались с быстрой прокруткой - PullRequest
2 голосов
/ 13 ноября 2009

На основе Пример проекта Apple TableViewSuite Я взял структуру числа 5, чтобы создать пользовательские нарисованные ячейки таблицы. Это прекрасно работает, и скорость прокрутки теперь просто фантастическая по сравнению с тем, когда я использовал перья.

Тем не менее, появилась одна ошибка, которую я не могу понять - если я быстро прокручиваю экран, содержимое ячеек, похоже, перепутается, и ячейки будут отображать содержимое, которое должно появиться в другой ячейке. Иногда несколько ячеек будут отображать один и тот же контент. Если я затем коснусь и удерживаю ячейку, как будто выбираю ее, она снова обновляется до нужного содержимого. Я проверил, что правильной ячейке передаются правильные данные из массива в viewcontroller таблицы, поэтому я предполагаю, что это некоторый графический сбой.

Любая помощь была бы отличной, я не могу понять, что я сделал по-другому с образцами. Соответствующий код ниже:

Просмотр контроллера cellforrowatindexpath

static NSString *CellIdentifier = @"FacilityCell";      
StoreDetailFacilityCell *cell = (StoreDetailFacilityCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[StoreDetailFacilityCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
[cell configureCell:[storeFacilities objectAtIndex:indexPath.row] atRow:indexPath];
return cell;

StoreDetailFacilityCell.m

@implementation StoreDetailFacilityCell
@synthesize storeDetailFacilityCellView;

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier]) {
        CGRect tzvFrame = CGRectMake(0.0, 0.0, self.contentView.bounds.size.width, self.contentView.bounds.size.height);
        storeDetailFacilityCellView = [[StoreDetailFacilityCellView alloc] initWithFrame:tzvFrame];
        [self.contentView addSubview:storeDetailFacilityCellView];
    }
    return self;
}

-(void)configureCell:(NSDictionary *)storeFacility atRow:(NSIndexPath *)row {
    NSLog([NSString stringWithFormat:@"updating %@ at row %i",[storeFacility objectForKey:@"facilityKey"],row.row]);
    storeDetailFacilityCellView.storeFacility = storeFacility;
}
-(void)redisplay {
    [storeDetailFacilityCellView setNeedsDisplay];
}
-(void)dealloc {
    [storeDetailFacilityCellView release];
    [super dealloc];
}

StoreDetailFacilityCellView.m

@implementation StoreDetailFacilityCellView

@synthesize highlighted;
@synthesize editing;
@synthesize storeFacility;

-(id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

-(void)setHighlighted:(BOOL)lit {
    if (highlighted != lit) {
        highlighted = lit;  
        [self setNeedsDisplay];
    }
}
-(void)drawRect:(CGRect)rect {
    UIColor *mainTextColor = nil;
    UIFont *mainFont = [UIFont systemFontOfSize:14];
    if (self.highlighted) {
        mainTextColor = [UIColor whiteColor];
    } else {
        mainTextColor = [UIColor blackColor];
    }
    if (!self.editing) {
        CGPoint point;
        [mainTextColor set];
        point = CGPointMake(80, 9);
        [[storeFacility objectForKey:@"facilityTitle"] drawAtPoint:point withFont:mainFont];
    }
}

-(void)dealloc {
    [storeFacility release];
    [super dealloc];
}

Ответы [ 2 ]

2 голосов
/ 13 ноября 2009

В конце концов я поработал над этим, я не вызывал setNeedsDisplay для вида ячейки, теперь он отлично работает.

1 голос
/ 13 ноября 2009

Я вижу одно несоответствие: в tableView:cellForRowAtIndexPath: вы звоните -[StoreDetailFacilityCellView initWithFrame:reuseIdentifier:], что должно быть initWithStyle:reuseIdentifier:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...