【问题标题】:UIImageView's UIImage gets set to nil after selectionUIImageView 的 UIImage 在选择后被设置为 nil
【发布时间】:2015-01-22 13:23:36
【问题描述】:

我已经尝试解决这个问题一个多小时了,并且没有比以前更接近,尽管破坏了很多东西然后再次修复它们,原始问题没有改变。

我完全不知道我的代码的哪些部分是相关的,如果您需要其他部分,请告诉我。

这是我的configureCell:forAnime 方法

- (void)configureCell:(UITableViewCell *)cell forAnime:(Anime *)anime {
[cell.contentView setTranslatesAutoresizingMaskIntoConstraints:NO];
NSDateFormatter* df = [[NSDateFormatter alloc] init];
[df setDateStyle:NSDateFormatterShortStyle];
[df setTimeStyle:NSDateFormatterNoStyle];

if ([anime.fetched boolValue]) {
    [(UIImageView *)[cell viewWithTag:401] sd_setImageWithURL:[anime getURLWithServer:[[NSUserDefaults standardUserDefaults] URLForKey:@"imageServer"]]];
    [(UILabel *)[cell viewWithTag:402] setText:anime.romajiName];
    [(UILabel *)[cell viewWithTag:403] setText:[NSString stringWithFormat:@"%@, %@ episode%@", anime.type, anime.numberOfEpisodes, [anime.numberOfEpisodes isEqualToNumber:@1]?@"":@"s"]];
    [(UILabel *)[cell viewWithTag:404] setText:[NSString stringWithFormat:@"%@ - %@", [df stringFromDate:anime.airDate], [df stringFromDate:anime.endDate]]];
}
else {
    [(UILabel *)[cell viewWithTag:402] setText:@"Anime not yet loaded"];
    [(UILabel *)[cell viewWithTag:403] setText:[NSString stringWithFormat:@"Anime ID: %@", anime.id]];
}

}

sd_setImageWithURL: 是我在 GitHub 上获得的 SDWebImage 框架的一部分。

现在,当我运行我的应用程序时,一切都完美地填充,图像已经从以前的运行中缓存并立即加载。 Screenshot

当我单击(因为我在模拟器中运行)时,一个单元格被选中,UIImage(显然)被设置为 nil,消失,并且 AutoLayout 将所有文本一直向左移动。 Screenshot

当我选择一个单元格时会调用此方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Anime *selectedAnime = [self.animeController objectAtIndexPath:indexPath];

AnimeDetailController *detailController = [self.storyboard instantiateViewControllerWithIdentifier:@"AnimeDetail"];
[detailController setRepresentedObject:selectedAnime];

[self.navigationController pushViewController:detailController animated:YES];
}

澄清:我是self.animeController

@property (strong, nonatomic) NSFetchedResultsController *animeController;

此外,当实际按住单元格时,它会得到一个深色背景,表明它已被选中,然后图像返回并且布局是应有的。

我完全不知道是什么导致了这种行为,请帮忙。

更新:我刚刚发现了一个非常棒的 Xcode 功能,名为“Debug View Hierarchy”,顾名思义,它以视觉方式显示视图层次结构,在这里我可以看到UIImageView 消失的单元格实际上已经向左移动,因此屏幕边缘与我的UILabels 的左边缘齐平。也许这可以帮助某人理解我如何让它不这样做。

更新:现在我尝试记录我的单元格内容视图框架的 x 坐标,因为它们正在被移动,实际上,使用以下代码:

- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
Anime *selectedAnime = (tableView == self.tableView) ? [self.animeController objectAtIndexPath:indexPath] : [self.resultsController.animeController objectAtIndexPath:indexPath];
NSLog(@"Will deselect \"%@\" Content view frame origin x: %f", selectedAnime.romajiName, [tableView cellForRowAtIndexPath:indexPath].contentView.frame.origin.x);
return indexPath;
}

我发现我的内容视图向左移动了 87 个点。我还发现tableView:willDeselectRowAtIndexPath: 由于某种原因总是被调用两次,并且错误的帧只能在取消选择回调中观察到,所以tableView:(UITableView *)tableView willDeselectRowAtIndexPath:tableView:(UITableView *)tableView didDeselectRowAtIndexPath:。在选择回调中,x 值应该是 0,但这并不意味着内容视图在它们应该在的位置,它们仍然显示为移位。

【问题讨论】:

  • 如果您选择一个单元格,其选定的背景视图将变得可见。我认为您已将图像添加到单元格的视图而不是其 content 视图 (developer.apple.com/library/ios/documentation/UserExperience/…)。
  • 我在一个外部 xib 文件中创建了这个单元格,注册如下:[self.tableView registerNib:[UINib nibWithNibName:@"AnimeCell" bundle:nil] forCellReuseIdentifier:@"Cell"];。我认为除了 InterfaceBuilder 中的内容视图之外,我无法将其添加到任何内容中,我不知道如何添加,并且在 xib 文件的层次结构中,UIImageView 显然位于“内容视图”下方。

标签: ios objective-c uitableview uiimageview sdwebimage


【解决方案1】:

我认为问题出在 [self.animeController objectAtIndexPath:indexPath] 中。您应该为该选定行初始化对象。所以你应该写 [self.animeController objectAtIndexPath:indexPath.]

【讨论】:

  • 我不这么认为,我已经编辑了我的帖子,self.animeController 是NSFetchedResultsController
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多