为啥我存储在 Core Data 中的布尔值没有立即显示?

Posted

技术标签:

【中文标题】为啥我存储在 Core Data 中的布尔值没有立即显示?【英文标题】:Why does my boolean value stored in Core Data not show up immediately?为什么我存储在 Core Data 中的布尔值没有立即显示? 【发布时间】:2010-02-08 20:03:47 【问题描述】:

我一直在开发一个列表应用程序,其中核心数据用于保留复选标记一切都很好,直到 xcode 崩溃。没有更改任何代码,但现在您必须单击该行,退出应用程序,然后重新启动它才能获得任何东西,而不是立即显示复选标记。这是代码以及我最初是如何获得代码的另一个问题。 How can a checkmark state be saved in core data?

非常感谢任何帮助。谢谢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];


    if ([[selectedObject valueForKey:@"check"] boolValue]) 
        [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"check"];
     else 
        [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"check"];
    



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *defaultCellIdentifier = @"Item";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease];
    

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath];
    cell.textLabel.text = [item valueForKey:@"name"];

    if ([[item valueForKey:@"check"] boolValue]) 
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
     else 
        cell.accessoryType = UITableViewCellAccessoryNone;
    

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;




-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accesoryTypeForRowWithInddexPath:(NSIndexPath *)indexPath 
    return UITableViewCellAccessoryNone;

【问题讨论】:

【参考方案1】:

您是否实现了必要的 NSFetchedResultsControllerDelegate 方法来捕捉数据模型的更新?如果没有,您的表将不知道更新该行的视觉状态。一些样板代码如下:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 

    [self.tableView beginUpdates];


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
   
    switch(type) 
    
        case NSFetchedResultsChangeInsert:
        
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        ; break;

        case NSFetchedResultsChangeDelete:
        
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
        ; break;
    


- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 
   
    switch(type) 
    
        case NSFetchedResultsChangeInsert:
        
            // This works around problems with inserting a row at the beginning of the list
            [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(newIndexPath.row + 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationFade];
        ; break;

        case NSFetchedResultsChangeDelete:
        
            if (self.tableView.editing)
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(indexPath.row + 1) inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationFade];
            else
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        ; break;

        case NSFetchedResultsChangeUpdate:
        
            [self updateCell:[self.tableView cellForRowAtIndexPath:indexPath] fromCategory:[fetchedResultsController objectAtIndexPath:indexPath]];
        ; break;

        case NSFetchedResultsChangeMove:
        
            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade];
        ; break;
    


- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 

    [self.tableView endUpdates];

【讨论】:

是的,事实证明在最新的 xcode 中存在一个错误,它给出了一个断言错误。为了修复它,我只是在旧的 xcode 上运行了该应用程序。 @Tanner - 如果是这样,为什么不将其发布为答案然后选择它?【参考方案2】:

您的核心数据模型是否有“默认值”? 也许它被设置为“NO”而不是“YES”。

【讨论】:

您好,它的设置都不是。上次它工作得很好。除了代码没有,我不知道崩溃后发生了什么变化。 这有什么关系?有人会假设默认值为 NO(未选中),直到用户选中它(YES)。这不是一个讽刺的评论,而是一个严肃的问题......为什么会有所作为?

以上是关于为啥我存储在 Core Data 中的布尔值没有立即显示?的主要内容,如果未能解决你的问题,请参考以下文章

Core Data:为啥要创建自定义持久存储?

如何在 Core Data 中存储星期几?

为啥Core Data会从我在NSDate的天数中减去1

如何在Google表格中为Google Data Studio数据源存储布尔值?

检查 NSFetchedResultsController / Core Data 中的现有值

为啥 R 中的逻辑(布尔值)需要 4 个字节?