У меня есть приложение UITableView, состоящее из текста и изображений. Ячейки иногда перезаписываются, и если я прокручиваю, проблема усугубляется. См. http://web-cars.com/images/temp_img/Simulator-Screen-Shot.png
У меня была такая же проблема в предыдущем приложении, и друг показал мне, как ее решить, создав подкласс UITableViewCell. Это было текстовое приложение, и я не могу получить то же решение с изображениями.
Вот мой подкласс UITableViewCell:
-(void)prepareForReuse {
self.permLabel101.text = @"";
self.permUIImageView201.image = nil;
}
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
UILabel *label101 = [[UILabel alloc]initWithFrame:CGRectMake(5, 5, 310, 100)];
label101.tag = 101;
[label101 setLineBreakMode:NSLineBreakByWordWrapping];
[label101 setFont:[UIFont systemFontOfSize:FONT_SIZE]];
label101.textColor = [UIColor blackColor];
label101.backgroundColor = [UIColor clearColor];
label101.numberOfLines = 0;
self.permLabel101 = label101;
[self.contentView addSubview:self.permLabel101];
UIImageView *image201 = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];
image201.tag = 201;
return self;
}
Вот мой cellForRowAtIndexPath. Я разделяю текст и изображения с помощью photo_text.
- (MyTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *object = (NSManagedObject *)[entityArray objectAtIndex:indexPath.row];
NSString *CellIdentifier = @"Cell";
int photo_text = [[object valueForKey:@"photo_text"]intValue];
MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[MyTableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.selectionStyle = UITableViewCellSeparatorStyleNone;
[self.tableView setSeparatorColor:[UIColor clearColor]]; // Eliminates border between cells
if (photo_text == 1) { // Image will be here
NSNumber *imgHeight = [[entityArray objectAtIndex:indexPath.row]valueForKey:@"imgHeight"];
float imgHeightFloat = [imgHeight floatValue];
NSLog(@"imgHeightFloat: %f", imgHeightFloat);
UIImageView *imv = [[UIImageView alloc]initWithFrame:CGRectMake(0, 2, 320, imgHeightFloat)]; // imv is OK
UIImageView *image201View = [[UIImageView alloc]initWithFrame:CGRectMake(0, 2, 320, imgHeightFloat)];
imv.image = [UIImage imageNamed:[object valueForKey:@"photo"]];
image201View.image = [UIImage imageNamed:[object valueForKey:@"photo"]];
NSLog(@"Image cell: %@", cell);
NSString *title = [object valueForKey:@"title"];
self.title = title;
[cell.contentView addSubview:image201View];
return cell;
} else if (photo_text == 2) { // Text will be here
UILabel *label101;
cell.selectionStyle = UITableViewCellSeparatorStyleNone;
[self.tableView setSeparatorColor:[UIColor clearColor]]; // Eleminates border between cells
NSString *text = [object valueForKey:@"text"];
CGSize constraint = CGSizeMake(296.0f, 20000.0f);
CGSize size = [text sizeWithFont: [UIFont systemFontOfSize:12.0f] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping];
NSLog(@"Text cell: %@", cell);
label101 = (UILabel *)[cell viewWithTag:101];
label101.frame = CGRectMake(5, 5, 320, size.height);
label101.text = [NSString stringWithFormat:@"%@", text];
NSString *title = [object valueForKey:@"title"];
self.title = title;
return cell;
}
// Configure the cell...
// return cell;
}
Ваши предложения приветствуются!
При подготовке к повторному использованию ячеек self.permUIImageView201.image = nil; не подействует, так как здесь нет ссылки! и каждый раз, когда ячейка повторно используется, `` cellForRowAtIndexPath '' добавляет представление изображения в ячейку без удаления предыдущего, что вызывает проблему.
@vignesh: Я думал, что - (void) prepareForReuse в MyTableViewCell удалит изображение, что предотвратит его повторное использование, но теперь я вижу, что это не так. Я пробовал image201View.image = nil; в cellForRowAtIndexPath и в MyTableViewCell, но там не повезло. Я согласен с тем, что добавляю изображение, не удаляя предыдущее, но не знаю, как удалить это изображение. Какие-либо предложения?
@safariyellow, присвоение ссылки с nil, не приведет к удалению представления, добавленного как subview, вам нужно сделать removeSubview с тегом при повторном использовании ячейки.





Друг смог указать мне правильное направление.
Моя основная проблема заключалась в том, что у меня был конфликт CellIdentifier.
У меня было следующее перед оператором if, разделяющим ячейки изображения и текста:
NSString *CellIdentifier = @"cell";
И мне нужно было использовать разные CellIdentifiers для ячеек изображения и текста:
NSString *CellIdentifier = @"cell";
и NSString * CellIdentifier = @ "ячейка2";
Также оказалось, что мне не нужно было помещать мои UILabel и UIImageView в подкласс UITableViewCell.
Наконец, чтобы избавиться от предупреждения на cellForRowAtIndexPath: мне нужно
` return cell;
} else {
return nil;
}`
проблема повторного использования ячеек. Это поможет. stackoverflow.com/questions/52258956/…, stackoverflow.com/questions/50916739/…