У меня есть UITableViewCell
, и мне нужно случайно помещать межстраничные изображения в некоторые из них. Это работает, но из-за кэширования ячеек изображения снова повторяются вниз по таблице. Предположим, что я предварительно решил разместить изображения в ячейках 1, 12 и 25, эти ячейки будут иметь свои изображения, но после ячейки 1 ячейки 4, 8 и т. Д. Могут также содержать это первое изображение.UIImageViews в UITableViewCells воссоздают себя в кэшированных ячейках
Я угадываю, что мне нужно сделать, это конкретно указать cellForRowAtIndexPath
очистить кэш и удалить любые изображения, если он не соответствует критериям для добавления изображения. Как мне это сделать? Я уже пробовал else
в инструкции if, которая принимает решение и назначает изображение. В этом else
я попытался установить изображение UIImageView
на nil
, но это не имеет никакого значения.
Есть ли другой способ очистить кеш, чтобы эти изображения не могли спамить свой путь вниз по странице через равные промежутки времени? Вот мой метод cellForRowAtIndexPath
, и строки, которые в настоящий момент находятся в последнем else
, не оказывают никакого влияния на изображения, поэтому они (я думаю) должны заменить что-то, что работает!
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
// Make and allocate the cell if necessary.
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Cell"];
if (cell == nil) {
cell = [[CustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"Cell"];
}
cell.lineLabel.text = [[self.fetchedResultsController objectAtIndexPath: indexPath] line];
cell.actorLabel.text = [[self.fetchedResultsController objectAtIndexPath: indexPath] actor];
[cell.lineLabel sizeToFitMultipleLines];
// Get the size each label needs to be when constrained to set width and very long height (8000).
CGSize labelSize = [cell.lineLabel.text sizeWithFont: cell.lineLabel.font constrainedToSize: CGSizeMake(265, 8000)];
if ([[cellsToContainInterstitialImages allKeys] containsObject: [thisLine.lineID stringValue]]) {
UIImageView *interstitialImage = [[UIImageView alloc] init];
NSNumber *cellTypeNumber = [cellsToContainInterstitialImages valueForKey: [thisLine.lineID stringValue]];
kInterstitialCellType cellType = [cellTypeNumber intValue];
if (cellType == kInterstitialCellTypeFirst) {
interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"man.png"]];
}
else if (cellType == kInterstitialCellTypeSecond) {
interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"woman.png"]];
}
else {
interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"child.png"]];
}
[interstitialImage setFrame: CGRectMake(10, cell.lineLabel.frame.size.height + cell.actorLabel.frame.size.height + 10, 150, 150)];
[cell addSubview: interstitialImage];
} else {
UIImageView *interstitialImage = [[UIImageView alloc] init];
[interstitialImage setImage: nil];
}
return cell;
}
Извините, я не совсем понимаю. Разве мой «UIImageView» уже добавлен в конструктор? Это отдельный метод, за пределами 'cellForRowAtIndexPath'? Не могли бы вы немного объяснить ответ? – Luke
Я получаю сообщение об ошибке «Дубликат интерфейса», если попытаюсь добавить частный раздел '@ interface'. Любая идея, почему это может быть? – Luke
@ lukech Пример показывает, что вы можете сделать в фактическом объявлении своей пользовательской ячейки (конечно, сохраните ваши другие методы). Вы также можете сделать расширение класса, если хотите, но это вопрос вкуса. Если вы хотите пройти маршрут расширения, замените '@interface CustomCell: UITableViewCell' на' @interface CustomCell() '. – dasblinkenlight