#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