【发布时间】: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