Iphone 插入操作后第一行不显示,请保存我的头发

Iphone 插入操作后第一行不显示,请保存我的头发,iphone,uitableview,core-data,Iphone,Uitableview,Core Data,我现在的情况是头发掉了 由核心数据驱动的非常简单的应用程序,它具有带有添加导航按钮的表视图控制器。它与食谱样本非常相似,但存在一些差异 模型中只有一个实体具有2个属性 未使用默认textLabel自定义主表中的单元格 核心数据部分很好,因为新条目被添加到底层存储中,并使用fetched results controller进行检索。当我添加新项目时,问题就出现了,该项目将放在列表的顶部。例如,这可以是空列表上的新项目,也可以是排序顺序位于顶部的项目放置在顶部的项目不可见单元格在那里,带有ni

我现在的情况是头发掉了

由核心数据驱动的非常简单的应用程序,它具有带有添加导航按钮的表视图控制器。它与食谱样本非常相似,但存在一些差异

  • 模型中只有一个实体具有2个属性
  • 未使用默认textLabel自定义主表中的单元格
核心数据部分很好,因为新条目被添加到底层存储中,并使用fetched results controller进行检索。当我添加新项目时,问题就出现了,该项目将放在列表的顶部。例如,这可以是空列表上的新项目,也可以是排序顺序位于顶部的项目放置在顶部的项目不可见单元格在那里,带有nil文本标签,但是,我清楚地看到获取的结果控制器发出了更新通知,我配置了单元格,用新文本更新

我可以使该单元格显示的唯一方法是滚动数据表以调用
cellforrowatinexpath
,然后更新项目文本。我添加了另一个项目,该项目将被放置在顶部,新项目文本同样不可见。我添加了一些位于底部的项目-没问题,单元格中的文本是可见的。最初,当我刚启动应用程序时,并没有问题,所有项目都是可见的

不确定没有源代码的人能否帮助解决这个问题,但仍然希望得到一些关于如何调试的提示。。。我尝试将委托调用与Receipe应用程序进行比较,结果都是一样的

UPD:


如果没有源代码,那么在添加调用的数据时很难精确定位

– insertRowsAtIndexPaths:withRowAnimation:

如果在添加数据后调用
[self.tableview reloadData]
,它是否显示为您正在转换到错误的类型。(复制/粘贴错误)您正在
tableView:cellforrowatinexpath

case NSFetchedResultsChangeUpdate:
    printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
    [self configureCell:(RecipeTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    break;
替换:

[self configureCell:(RecipeTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
与:

一些意见:

操作方法中的这一行:

Word* word = [NSEntityDescription insertNewObjectForEntityForName:@"Word" inManagedObjectContext:self.managedObjectContext];
…触发:

case NSFetchedResultsChangeInsert:
    printf("didChangeObjectAtRow: %d: insert\n", newIndexPath.row);
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    break;
。。。在对话框完成之前以及在
Word
managedObject的
Word
属性具有值之前。这将创建填充为空的单元格

(我在Recipie应用程序中记录了这些方法,并获得:

2010-07-07 18:56:08.848 Recipes[53880:207] NSFetchedResultsChangeInsert:=<NSIndexPath 0x11286a0> 2 indexes [0, 0]
2010-07-07 18:56:22.872 Recipes[53880:207] NSFetchedResultsChangeUpdate=<NSIndexPath 0x11286a0> 2 indexes [0, 0]
2010-07-07 18:56:08.848食谱[53880:207]nsfetchedresultschangeinert:=2个索引[0,0]
2010-07-07 18:56:22.872食谱[53880:207]NSFetchedResultsChangeUpdate=2个索引[0,0]
…按顺序。)

有趣的是,您不需要记录
nsfetchedresultschangeensert
。这让我觉得少了些什么。可能在你的日志中

我认为问题实际上可能是由使用模态控制器来更改Word.Word值引起的。模式显示可防止表格在出现时响应
NSFetchedResultsChangeUpdate
,因此它将保留初始空值,直到您滚动,从而导致它从“获取的结果”控制器重新加载单元格。只是猜测而已

您可以通过插入Word对象,然后在没有模式视图的情况下更改代码中的Word属性来进行测试。也许用定时器来给一点延迟。如果这样做有效,那么肯定是模态视图导致了问题

如果没有,我认为您应该注意记录整个索引路径对象,以确保不会出现某些异常的部分

我会改变:

case NSFetchedResultsChangeUpdate:
    printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
    [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    break;
致:


我不知道为什么recipes应用程序会超越这种行为,因为configureCell仍然会被调用

您是否在-viewWillDisplay:动画中尝试过[self.tableView reloadData]?
我在第一排也有类似的问题。但是在我添加了这个之后,一切都很好。

我遇到了类似的问题,开始寻找解决方案,并偶然发现了这篇旧文章。我没有看到问题得到解决,所以我查看了方法中调用的内容

  • (void)控制器:(NSFetchedResultsController*)控制器didChangeObject:(id)一个对象 atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)类型 newindepath:(nsindepath*)newindepath
看起来,当您从详图控制器返回时,它实际上是在执行更新,而不是执行插入。这与core data recipes应用程序让您在调用detail controller之前创建添加到数据库的项的顺序有关

通过在NSFetchedResultsChangeUpdate中添加以下行,我能够获得显示的第一行

        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

是的,fetchedResultsController委托的整个
didChangeObject
都是从配方样本复制的。事实上,我提到添加了行,只是textLabel是
nil
,因此我可以在顶部看到一个空行。再次,一旦我滚动表格,单元格的值就会出现。当我第一次在上下文中创建一个空对象时,以及当用户保存输入数据时,插入操作已启动,将为该单元格调用update。因此,将单元格插入到具有空字符串值的表中。如果我从更新中重新加载数据,就会出现单元格,但这不是解决方案,因为这是一个昂贵的操作,并且不像在示例中那样,对重新加载数据的调用是正确的。它不像您认为的那样昂贵,因为核心数据缓存数据。磁盘不太可能被访问以重新蚀刻对象。此外,如果我用一些值(而不是nil)硬编码单元格,则该项显示良好。因此,似乎
nil
以某种方式混淆了单元格…@falconcreek:在apple CoreDataReceipes示例代码中,没有调用reloadData,我需要知道我为什么要调用。然后你必须发布更多代码。否则我们都有脱发的风险。我看不到你在哪里做
[tableView开始更新]
[tableView结束更新]
。你在叫这些吗?在WWDC 2010的一段视频中,苹果解释说,最好重新加载整个表。你可能想看他们的v
2010-07-07 18:56:08.848 Recipes[53880:207] NSFetchedResultsChangeInsert:=<NSIndexPath 0x11286a0> 2 indexes [0, 0]
2010-07-07 18:56:22.872 Recipes[53880:207] NSFetchedResultsChangeUpdate=<NSIndexPath 0x11286a0> 2 indexes [0, 0]
case NSFetchedResultsChangeUpdate:
    printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
    [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    break;
case NSFetchedResultsChangeUpdate:
    printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    break;
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];