为啥我存储在 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 中的布尔值没有立即显示?的主要内容,如果未能解决你的问题,请参考以下文章
如何在Google表格中为Google Data Studio数据源存储布尔值?