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

Ios 删除包含核心数据的单元格时,同一单元格显示两次,ios,swift,xcode,uitableview,core-data,Ios,Swift,Xcode,Uitableview,Core Data,当我删除包含核心数据的单元格时,我遇到了一个问题。 当我在单元格之间删除时,已删除单元格的下一个单元格在下一个单元格之后变得相同。它看起来像下面。 看起来就像。当我进出表视图时,它被正确地删除了。 但是,当我删除最后一个单元格时,它看起来不错。它工作得很好!不仅仅是这种情况(删除最后一个单元格) func tableView(tableView:UITableView,commit editingStyle:UITableViewCellEditingStyle,forRowAt indexP

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

看起来就像。当我进出表视图时,它被正确地删除了。 但是,当我删除最后一个单元格时,它看起来不错。它工作得很好!不仅仅是这种情况(删除最后一个单元格)

func tableView(tableView:UITableView,commit editingStyle:UITableViewCellEditingStyle,forRowAt indexPath:indexPath){
如果editingStyle==.delete{
//修正:删除
让我们引用:Quotes=Quotes![indexPath.row]
self.context.delete(引号)
做{
尝试self.context.save()
self.quotes?.remove(位于:indexPath.row)
tableView.deleteRows(位于:[indexPath],带:.fade)
}捕捉错误{
打印(错误)
}
}
}
func controllerWillChangeContent(控制器:NSFetchedResultsController){
self.tableview.beginUpdate()
}
func controllerDidChangeContent(控制器:NSFetchedResultsController){
self.tableview.endUpdates()
}
我不知道怎么了,请告诉我这个情况:(


我的模拟器是v10.1,Xcode版本是8.2.1,Blow代码适合我

 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)
}

尝试将调用包装为
deleteRows
,如下所示:

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

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


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

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()
}

这不是一个完美的答案,但它可能是第二好的策略。如果您有比现在更好的方法,请留下评论:-)

提供一些建议screenshots@GaneshKumar我刚刚加上去的@lucy删除单元格或滑动以显示编辑选项时会发生这种情况?不要在tableview中删除行,而是在数组中删除适当的值,然后重新加载tableview…@Dhivya无需重新加载整个tableview即可删除一行。您只需使用deleteRows及其batter选项,谢谢您的回答!但是,它仍然有同样的问题:-(谢谢你!我错过了那个信息:(对不起,现在我更新了它!我用两个功能处理了它如果这对你有效,你能接受这个答案吗?谢谢。
begin/endUpdates
在这种情况下是完全无用的(一次删除操作)。请参阅…如果您希望在讨论开始时同时执行后续的插入、删除和选择操作…请参阅。此外,这些方法都是在委托方法中调用的。谢谢。我不确定是否有必要,这就是为什么我说“尝试”这样做。我记不起自己曾经做过,但是文档的模糊性——“表属性可能会变得无效”-向我建议可能是必要的。我认为这很容易尝试。我也没有在文档中看到任何内容表明,如果在tableview委托方法中进行更改,则这些语句是不必要的。这是一个单一的
insert/delete/move
操作与同时执行多个操作的问题。OP使用
NSFetchedResultsController
始终在更改之前和之后调用
controllerWillChangeContent
ControllerIDChangeContent
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()
}