uitableview разбивается при прокрутке на ipad

#iphone #objective-c #uitableview #uiscrollview

#iPhone #objective-c #uitableview #uiscrollview

Вопрос:

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

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *hlCellID = @"hlCellID";

UITableViewCell *hlcell = [tableView dequeueReusableCellWithIdentifier:hlCellID];
if(hlcell == nil) {
    hlcell =  [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:hlCellID] autorelease];
    hlcell.accessoryType = UITableViewCellAccessoryNone;
    hlcell.selectionStyle = UITableViewCellSelectionStyleNone;
    [hlcell.contentView removeAllSubViews];


}
//NSLog(@"the scetions is %@",sections);

int section = indexPath.section;


for(int i=0;i<4;i  ){


    CGRect rect = CGRectMake(18 192*i, (4*indexPath.row) 50, 120, 150);

    if ((4*indexPath.row) i>=[self.imagesToDisplay count]) {
        break;
    }
    UIImage *imageToDisplay=[UIImage imageWithData:[self.imagesToDisplay objectAtIndex:(4*indexPath.row) i]];
    NSLog(@"The size of the image is:%@",NSStringFromCGSize(imageToDisplay.size));
    UIButton *button=[[UIButton alloc] initWithFrame:rect];
    [button setFrame:rect];

    [button setBackgroundImage:imageToDisplay   forState:UIControlStateNormal];
    [button setContentMode:UIViewContentModeCenter];

    NSString *tagValue = [NSString stringWithFormat:@"%d%d",indexPath.row,i];
    NSLog(@"the tag is %@",tagValue);
    button.tag = [tagValue intValue];
    NSLog(@"....tag....%d", button.tag);
    [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [hlcell.contentView addSubview:button];
    [button release];
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(18 192*i,(4*indexPath.row) 100 70 , 100, 100)] ;
    label.text = @"price $0.99";
    label.textColor = [UIColor blackColor];
    label.backgroundColor = [UIColor clearColor];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont fontWithName:@"ArialMT" size:12]; 

    [hlcell.contentView addSubview:label];
    [label release];


}


return hlcell;
  

}

для каждого изображения действует как uibutton.я пытаюсь загрузить около 1000 изображений. эти изображения я беру с сервера.когда одно изображение загружается в мое приложение, я обновляю общую ячейку.

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:ceil((float)[gridView.imagesToDisplay count]/4)-1 inSection:0];
NSArray *cellIndexPath=[NSArray arrayWithObjects:indexPath,nil];
[gridView.tableview reloadRowsAtIndexPaths:cellIndexPath withRowAnimation:UITableViewRowAnimationNone];

до сих пор мой код работает нормально, и когда я пытаюсь прокручивать много раз после загрузки всех изображений, происходит сбой. и мой GDB отображается как предупреждение о памяти. может кто-нибудь подсказать мне, почему возникает проблема.Заранее спасибо за ваш ответ.

Ответ №1:

Похоже, что вы всегда выделяете новые изображения и отображаете их в ячейке, но на самом деле вы никогда не освобождаете изображения, когда ячейка больше не отображается.

Определение ячейки UITableView гласит, что как только ячейка больше не используется, она очищается и подготавливается для нового содержимого. В вашем коде вы всегда добавляете новые подвиды в ячейку, но никогда фактически не выпускаете содержимое.

Лучшее решение вашей проблемы — реализовать UITableViewCell, создав его подкласс и вручную установив изображения. Кроме того, реализовать

 - (void)prepareForReuse
  

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