当我删除一个包含核心数据的单元格时,同一个单元格显示两次

Posted

技术标签:

【中文标题】当我删除一个包含核心数据的单元格时,同一个单元格显示两次【英文标题】:When I delete a cell with Core data, same cell show twice 【发布时间】:2017-02-24 05:44:03 【问题描述】:

当我删除一个包含核心数据的单元格时,我遇到了一个问题。 当我在单元格之间删除时,已删除单元格的下一个单元格在下一个单元格之后变得相同。它看起来像下面。

看起来像。当我出去并返回表格视图时,它已正确删除。 但是,当我删除最后一个单元格时,它看起来不错。它运作良好!它不仅发生在这种情况下(删除最后一个单元格)!

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 

    if editingStyle == .delete 
        //FIXME: Delete 
        let quote:Quotes = quotes![indexPath.row]
        self.context.delete(quote)

        do 
            try self.context.save()
            self.quotes?.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)

         catch let error 
            print(error)
        
    


func controllerWillChangeContent(controller: NSFetchedResultsController<NSFetchRequestResult>) 
        self.tableview.beginUpdates()
    

func controllerDidChangeContent(controller: NSFetchedResultsController<NSFetchRequestResult>) 
        self.tableview.endUpdates()
    

我不知道是怎么回事,请告诉我这种情况:(

我的模拟器是 v10.1,Xcode 版本是 8.2.1

【问题讨论】:

提供一些截图 @GaneshKumar 我刚刚添加了它! @lucy 删除单元格或滑动显示编辑选项时会发生这种情况? 而不是删除tableview中的行删除数组中的适当值然后重新加载tableview... @Dhivya 无需重新加载整个 tableView 即可删除一行。您可以简单地使用 deleteRows 及其击球手选项, 【参考方案1】:

Blow Code 对我有用!

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 

      if editingStyle == .delete 
    //FIXME: Delete 
    let quote:Quotes = quotes![indexPath.row]
    self.context.delete(quote)

    do 
        try self.context.save()

        deleteRow(indexPath)

     catch let error 
        print(error)
    



func deleteRow(indexPath : NSIndexPath)
  self.quotes?.remove(at: indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Top)

【讨论】:

感谢您的回答!但是,它仍然遇到同样的问题:-(【参考方案2】:

尝试像这样包装对deleteRows的调用:

tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .fade)
tableView.endUpdates()

来自Apple UIKit documentation

如果您不在此块内进行插入、删除和选择调用,则行数等表属性可能会变得无效。

【讨论】:

谢谢你!我错过了那个信息:(对不起,现在我更新了!我用两个函数处理它 如果这对你有用,你能接受这个答案吗?谢谢。 begin/endUpdates 在这种情况下完全没用(单个删除操作)。请参阅讨论开头的...如果您希望后续插入s、删除和选择操作s...同时。无论如何,这些方法都是在委托方法中调用的。 谢谢。我不确定是否有必要,这就是为什么我说“尝试”这样做。我不记得自己必须这样做,但文档的模糊性 - “表属性可能变得无效” - 向我暗示这可能是必要的。我认为这很容易尝试。如果更改是在 tableview 委托方法中完成的,我也没有在文档中看到任何内容说这些语句是不必要的。 这是一个单个insert/delete/move操作与多个操作同时的问题。 OP 使用NSFetchedResultsController,它在更改前后始终调用controllerWillChangeContentcontrollerDidChangeContent【参考方案3】:

问题是单元格高度。与屏幕高度相比,单元格高度太大。 当我更改单元格高度时,效果很好。

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat     
    return 20 //before: view.frame.width 

但是,我想创建形状单元格。所以,我在顶部添加了刷新控制器。

var refreshControl: UIRefreshControl!
override func viewDidLoad() 
    super.viewDidLoad()
    refreshControl = UIRefreshControl()
    refreshControl.tintColor = UIColor(red: 0.996, green: 0.878, blue: 0.196, alpha: 1.00)
    refreshControl.addTarget(self, action: #selector(self.refresh), for: UIControlEvents.valueChanged)
    tableview.addSubview(refreshControl)

func refresh() 
    self.tableview.reloadData()
    self.refreshControl?.endRefreshing()

这不是完美的答案,但它可能是次优策略。如果您有比现在更好的方法,请发表评论:-)

【讨论】:

以上是关于当我删除一个包含核心数据的单元格时,同一个单元格显示两次的主要内容,如果未能解决你的问题,请参考以下文章

当我单击 tableview 单元格时,UITextfield 没有显示文本?

UITableView - 如何在删除单元格时删除文件?

当我在按钮操作上从 TableView 中删除单元格时,应用程序崩溃了 - iOS Swift

删除高度大于其他单元格的单元格时,动画看起来很尴尬

iOS 7 UITableView 问题 - 当我们已经有一个单元格时尝试设置滑动以删除单元格

为啥当我在同一行中编辑另一个单元格时,此数据表单元格会恢复为旧值?