我一直试图解决这个问题超过一个小时了,并且没有比以前更接近,尽管破坏了很多东西然后再次修复它们,而没有改变原来的问题。
我完全不知道我的代码的哪些部分是相关的,如果您需要其他部分,请告诉我。
这是我的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,但这并不意味着内容视图应该是它们应该存在的位置,它们仍然会出现移位。
答案 0 :(得分:0)
我认为问题出现在[self.animeController objectAtIndexPath:indexPath]中。您应该初始化该选定行的对象。所以你应该写[self.animeController objectAtIndexPath:indexPath。]