选择后,UIImageView的UIImage设置为nil

时间:2015-01-22 13:23:37

标签: ios objective-c uitableview uiimageview sdwebimage

我一直试图解决这个问题超过一个小时了,并且没有比以前更接近,尽管破坏了很多东西然后再次修复它们,而没有改变原来的问题。

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

这是我的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功能叫做#34; Debug View Hierarchy"顾名思义,它以可视方式显示视图层次结构,在这里我可以看到UIImageView消失的单元格实际上已向左移动,因此屏幕边缘与我的UILabel的左边缘。也许这可以帮助某人理解我是如何做到的,而不是那样做。

更新:现在我尝试记录我单元格内容视图框架的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,但这并不意味着内容视图应该是它们应该存在的位置,它们仍然会出现移位。

1 个答案:

答案 0 :(得分:0)

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