从部分移动最后一行时如何删除部分标题

Posted

技术标签:

【中文标题】从部分移动最后一行时如何删除部分标题【英文标题】:How to remove section header when moving last row from a section 【发布时间】:2016-04-25 23:08:31 【问题描述】:

我有一个连接到核心数据的 UITableView。表格视图具有动态单元格并将行分组为部分(类别)。

我可以通过在部分之间拖动来移动行,这适用于核心数据,除非我拖动一行并且部分变为空。我希望节标题消失,但它保留为标题,内部没有行。然后,如果我尝试向后拖动一行,则会出现错误。

我已经为 didChangeObject 和 didChangeSection 实现了 NSFetchedResultsController 函数。但是,当拖动行时,我发现我必须将 fetchedResultsController 的委托设置为 nil。

这是处理移动的部分代码。

func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) 

  // Create array of fetched  items from the stack
  var items = fetchedResultsController.fetchedObjects! as! [Item]

  // Convert the index paths to row number in the table.
  let destinationRow = rowAtIndexPath(destinationIndexPath)
  var sourceRow = rowAtIndexPath(sourceIndexPath)

  // Source row has to be reduced by one if it was moved to lower section because tableview is counting the row twice, once in the new section and once as the row index in the old section.
  if sourceIndexPath.section > destinationIndexPath.section 
    sourceRow -= 1
  

  let newCategory = fetchedResultsController.sections![destinationIndexPath.section].name

  // Get the  item of from the source index path and update the category
  let item = fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! Item
  item.category = newCategory

  // Do not trigger delegate methods when changes are made to core data
  fetchedResultsController.delegate = nil

  // Move the  item in core data
  items.removeAtIndex(sourceRow)
  items.insert(item, atIndex: destinationRow)


  do 
    try coreDataStack.context.save()
   catch 
    fatalCoreDataError(error)
  

  fetchedResultsController.delegate = self

我没有找到任何可以回答这个问题的问题,尤其是在 Swift 中。 非常感谢任何解决此问题的帮助。

【问题讨论】:

【参考方案1】:

为什么需要将delegate 设置为nil?如果这是因为出现错误,表明您执行了错误的操作。

回答您最初的问题:由于您使用的是NSFetchedResultsController,因此该部分将通过NSFetchedResultsControllerDelegate 方法controller(_, didChangeSection, atIndex, forChangeType) 自动删除

真正的问题是,你为什么将delegate 设置为nil

【讨论】:

我将委托设置为 nil,因为我通过拖动行来更改 tableview。在这种情况下,我不希望 NSFetchedResultsController 触发方法控制器(,didChangeObject,atIndex,forChangeType),因为移动已经在表格视图中完成。我尝试保持委托处于活动状态,但由于某种原因它不会触发方法控制器(、didChangeSection、atIndex、forChangeType)。什么动作会触发这个方法? 即使在拖动行时,您仍然希望使用NSFetchedResultsController 的方法。您不移动行,而是更改将导致行移动到新位置的基础数据,然后让 NSFetchedResultsController 完成其工作。 感谢您的提示!我会尽力解决这个问题。任何在哪里可以找到一些好的示例代码的建议将不胜感激。我看到你在 youtube 上有一些有趣的演示:) 实现NSFetchedResultsControllerDelegate 文档中的代码。当您移动一行时,您只需调整将导致该行排序到NSManagedObject 中的新位置的值。这就是你需要做的。没有示例代码可以为您完成第二步,因为这取决于您的代码库。 谢谢!我现在设法触发控制器(_,didChangeSection,atIndex,forChangeType),当没有更多行时,节标题消失。然而,这导致了关于 UITableView 行为的其他问题,但我将为此提出一个新问题。

以上是关于从部分移动最后一行时如何删除部分标题的主要内容,如果未能解决你的问题,请参考以下文章

从 tableview 部分删除最后一行时,iOS 应用程序崩溃

删除 UITableView 部分的最后一行而不删除部分?

使用 NSFetchedResultsController 删除部分中的最后一行 -> 崩溃

如何从一行中删除某些单词,但将其余部分放入带有批处理的字符串/变量中?

删除部分的最后一行后,应用程序崩溃

使用 NSFetchedResultsController 删除部分最后一行的错误消息