NSFetchedResultsChangeMove在自定义UITableViewCell中显示不正确的标签
我很确定有一种更简单的方法可以做到这一点,而我在所有的阅读中都忽略了这一点……但这让我发疯。我很累-如果这变得冗长,请道歉 我在我的应用程序中使用了一个NSFetchedResultsController——这是一个非常标准的问题——它可以正常工作。两个部分,顺序正确,等等。当用户点击第一部分中的单元格时,创建两个部分的属性的BOOL值会反转-它会移动到第二部分BOOL值会再次翻转-反之亦然…再次,效果非常好 这就是我的实现变得有点古怪的地方。最终,我想支持iAds-根据HIG,这些应该放在屏幕底部…我发现最简单的方法是将UITableView放在UIView中,以避免一些我现在无法理解的逻辑原因-但这就是我所拥有的-UIView和UITableView 我正在使用带有原型单元的故事板——具体来说是两个。一个用于添加内容,并充当两个部分之间的分隔符。另一个是要显示的默认单元格。当我为这个单元注册IBOutlets时,它会抛出一个异常,这是一个问题,但我能够解决它。因此,我一直在做的是使用cell.contentView.subview来获取需要处理的元素:NSFetchedResultsChangeMove在自定义UITableViewCell中显示不正确的标签,uitableview,uilabel,nsfetchedresultscontroller,uistoryboard,Uitableview,Uilabel,Nsfetchedresultscontroller,Uistoryboard,我很确定有一种更简单的方法可以做到这一点,而我在所有的阅读中都忽略了这一点……但这让我发疯。我很累-如果这变得冗长,请道歉 我在我的应用程序中使用了一个NSFetchedResultsController——这是一个非常标准的问题——它可以正常工作。两个部分,顺序正确,等等。当用户点击第一部分中的单元格时,创建两个部分的属性的BOOL值会反转-它会移动到第二部分BOOL值会再次翻转-反之亦然…再次,效果非常好 这就是我的实现变得有点古怪的地方。最终,我想支持iAds-根据HIG,这些应该放在屏幕
NSArray *cellSubViews = cell.contentView.subviews;
if ([cellSubViews count] == 3) {
// editing accessory view
cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator;
// default background image view
cell.backgroundView = self.defaultClockCellBackgroundImageView;
// clock name label
UILabel *clockNameLabel = [cellSubViews objectAtIndex:2];
clockNameLabel.text = clock.name;
clockNameLabel.textColor = (indexPath.section == 0 && ![clock.isAddClockCell boolValue])
? [UIColor whiteColor]
: [UIColor lightTextColor];
// view child button
UIButton *viewChildButton = [cellSubViews objectAtIndex:0];
UIImage *viewChildClocksButtonBackgroundImage;
if (self.clockForFetch != nil) {
//NSLog(@"child clocks list - N/A");
viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"childcell_blank"];
viewChildButton.enabled = NO;
} else if ([clock.childClocks count] < 2) {
//NSLog(@"add child button");
viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_addchild"];
} else if (![clock.isRunning boolValue]
|| [self totalChildClocksRunning:clock] < 1) {
//NSLog(@"view child button");
// children clocks cannot be running while parent is stopped;
// therefore, no need to actually check
// this solves the "wait for cell animation to end" issue
// without the need for tableview reload data
viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild"];
} else {
//NSLog(@"view child running button");
viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild_running"];
}
[viewChildButton setImage:viewChildClocksButtonBackgroundImage forState:UIControlStateNormal];
viewChildButton.hidden = NO;
// view time entries list for clock
UIButton *detailDisclosureButton = [cellSubViews objectAtIndex:1];
UIImage *detailDisclosureButtonBackgroundImage = (self.clockForFetch == nil)
? [UIImage imageNamed:@"parentcell_detaildisclosure"]
: [UIImage imageNamed:@"childcell_detaildisclosure"];
[detailDisclosureButton setImage:detailDisclosureButtonBackgroundImage
forState:UIControlStateNormal];
detailDisclosureButton.hidden = NO;
if (self.editing) {
viewChildButton.hidden = YES;
detailDisclosureButton.hidden = YES;
}
}
点击Alpha和Beta单元格后的表格如下:
---------------
| gamma |
---------------
| *delimiter* |
---------------
| beta |
---------------
| beta |
---------------
但是,如果我点击标记为Beta的第一个单元格中的custom detail Exposition(自定义详细信息披露)按钮(该单元格应为Alpha),我会将正确的对象传递到详细信息视图:
--------------------------------------------
| < back detail view for alpha edit |
--------------------------------------------
因此,fetched results控制器正在更新——它在与表视图对话时似乎没有一致地进行配置。在上面的configure cell方法中,我检查了控制器中找到的对象的名称,它们也是正确的;i、 例如,索引路径1,0处的行的第一个beta单元格是Alpha-而不是beta-即使表视图显示beta
我一直看到有人提到自定义单元格需要setNeedsDisplay和/或setNeedsLayout,但我不太理解这一点——尽管我已经尝试将它放在代码中我能想到的任何地方。NSFetchedResultsChangeMove是当用户点击一个单元格时被调用的东西——我已经尝试了很多我在网络上看到的变化,包括在这里修复我认为类似的小故障——但都没有用
我相信这个构造会随着时间的推移而成熟,因为这是第一次尝试,但是,正如我所说,我遇到了相同的问题,因为当时不存在完全不同的构造故事板,并且仍然可能重复这个问题
如蒙协助,将不胜感激。而且,如果这里有一个完全相同的问题的答案,我为我的重复道歉。所以,这里是我为解决这个问题所做的,似乎有两个可能的贡献者我可以想到这个问题;希望这能帮助其他人,如果他们发现自己处于同样的情况 我有两个不同的原型单元格:默认单元格和分隔符单元格。因此,直接在索引路径调用configure单元可能会导致意外结果。因此,无论我在哪里调用configureCell atIndexPath,我都只调用CellForRowatinexPath。例如,在我的fetched results controller update table方法中,我修改了所有内容以调用cellforrowatinexpath,而不是具体的change update case,它通常调用configure cell For row at index path:
case NSFetchedResultsChangeUpdate:
//NSLog(@"NSFetchedResultsChangeUpdate");
[self.TJTableView cellForRowAtIndexPath:indexPath];
break;
使用子视图在单元格内容视图中行进似乎无法保持自身,而且这不是一种非常优雅的方式;因此,根据本文的说明,我用一个自定义单元格将UITableViewCell子类化——这样我就可以连接IBOutlet并直接在索引路径的配置行中引用标签和按钮
另外,iTunes U的Standford类有一个名为“获取结果控制器”“表视图控制器”的东西……在这里有一些关于暂停托管对象上下文的自动更新的方法。我想知道这是否与这个问题有关;但是,我真的不知道如何检查……仍然不熟悉Objective-C中的对象继承。
case NSFetchedResultsChangeUpdate:
//NSLog(@"NSFetchedResultsChangeUpdate");
[self.TJTableView cellForRowAtIndexPath:indexPath];
break;