Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NSFetchedResultsChangeMove在自定义UITableViewCell中显示不正确的标签_Uitableview_Uilabel_Nsfetchedresultscontroller_Uistoryboard - Fatal编程技术网

NSFetchedResultsChangeMove在自定义UITableViewCell中显示不正确的标签

NSFetchedResultsChangeMove在自定义UITableViewCell中显示不正确的标签,uitableview,uilabel,nsfetchedresultscontroller,uistoryboard,Uitableview,Uilabel,Nsfetchedresultscontroller,Uistoryboard,我很确定有一种更简单的方法可以做到这一点,而我在所有的阅读中都忽略了这一点……但这让我发疯。我很累-如果这变得冗长,请道歉 我在我的应用程序中使用了一个NSFetchedResultsController——这是一个非常标准的问题——它可以正常工作。两个部分,顺序正确,等等。当用户点击第一部分中的单元格时,创建两个部分的属性的BOOL值会反转-它会移动到第二部分BOOL值会再次翻转-反之亦然…再次,效果非常好 这就是我的实现变得有点古怪的地方。最终,我想支持iAds-根据HIG,这些应该放在屏幕

我很确定有一种更简单的方法可以做到这一点,而我在所有的阅读中都忽略了这一点……但这让我发疯。我很累-如果这变得冗长,请道歉

我在我的应用程序中使用了一个NSFetchedResultsController——这是一个非常标准的问题——它可以正常工作。两个部分,顺序正确,等等。当用户点击第一部分中的单元格时,创建两个部分的属性的BOOL值会反转-它会移动到第二部分BOOL值会再次翻转-反之亦然…再次,效果非常好

这就是我的实现变得有点古怪的地方。最终,我想支持iAds-根据HIG,这些应该放在屏幕底部…我发现最简单的方法是将UITableView放在UIView中,以避免一些我现在无法理解的逻辑原因-但这就是我所拥有的-UIView和UITableView

我正在使用带有原型单元的故事板——具体来说是两个。一个用于添加内容,并充当两个部分之间的分隔符。另一个是要显示的默认单元格。当我为这个单元注册IBOutlets时,它会抛出一个异常,这是一个问题,但我能够解决它。因此,我一直在做的是使用cell.contentView.subview来获取需要处理的元素:

    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;