删除UITableViewCell:NSInternalInconsistencyException?

时间:2015-04-29 09:06:32

标签: ios uitableview swift cells

当我尝试从UITableView删除单元格时出现错误。我查看过很多链接(例如,这个链接就是我要做的。下面是我的代码:

var countdownTime = expirDate - currentDate
    timer.setCountDownTime(countdownTime)
    println("Count : \(self.offers.count)")
    timer.startWithEndingBlock { (countdownTime) -> Void in
        //If the times have expired, then delete the row
        self.tableView.beginUpdates()
        self.offers.removeAtIndex(indexPath.row)
        self.tableView.deleteRowsAtIndexPaths([indexPath.row], withRowAnimation: UITableViewRowAnimation.Fade)
        self.tableView.endUpdates()
    }
timer.start()

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return offers.count
}
//Only one section
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

我希望在计时器完成后删除单元格,offers数组是我用来填充UITableView的数组。我离开了这个Assertion Failure -[UITableView _endCellAnimationsWithContext],我认为这会帮助我正确地删除/插入行,但我仍然会收到错误说:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

任何帮助将不胜感激!

编辑:我可能遇到的一个问题,我正在尝试删除单元格,同时将单元格插入UITableView。我正在插入单元格,设置单元格内容,然后如果该单元格的计时器已存在超过24小时,则删除该单元格。这很糟糕,因为当它认为表视图中有1个单元格时,单元格将尝试插入下一个单元格。有没有更好的方法来做到这一点?

编辑2:插入表格的代码:

           ...//Code to insert into database
    override func viewDidLoad() {
    super.viewDidLoad()

    //setupOffers()

    setupOffers { (result, offer) -> Void in
        if(result == true){
            //Insert each row one by one.
            var currentCount = self.offers.count
            var indexPaths: [NSIndexPath] = [NSIndexPath]()
            indexPaths.append(NSIndexPath(forRow:currentCount, inSection: 0))
            self.offers.append(offer)
            currentCount++;

            //Update based on each table view index.
            self.tableView.beginUpdates()
            self.tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: UITableViewRowAnimation.Bottom)
            self.tableView.endUpdates()
            //Method 2 to update uitableview

            //self.tableView.reloadData()
        }
    }
    // Do any additional setup after loading the view, typically from a nib.
    self.tableView.delegate = self
    self.tableView.dataSource = self
    self.tableView.rowHeight = UITableViewAutomaticDimension
    self.tableView.rowHeight = 145.0

}

3 个答案:

答案 0 :(得分:0)

self.tableView.beginUpdates()

之后尝试self.offers.removeAtIndex(indexPath.row)

编辑: 删除beginUpdatesendUpdates,因为self.tableView.deleteRowsAtIndexPaths([indexPath.row], withRowAnimation: UITableViewRowAnimation.Fade)应该足以刷新表格。

编辑2:更新后检查offers的计数是否正确。在删除项目之前和之后以及return offers.count之后打印其计数。

答案 1 :(得分:0)

在开始表视图self.offers.removeAtIndex(indexPath.row)上的更新之前添加语句self.tableView.beginUpdates()

self.offers.removeAtIndex(indexPath.row)
self.tableView.beginUpdates()

因为可能会在表视图上启动更新,并且在从数组中删除对象之前返回行数,从而可能导致不一致。

答案 2 :(得分:0)

我认为这只是一个缓存问题。您的fetchedResultController不会自动重新获取结果,因为它会缓存结果。这意味着,当再次调用tableView:numberOfRowsInSection:时,即使您删除了一个项目,结果计数仍然会返回数字。 使用此代码...

self.tableView.beginUpdates()
self.tableView!.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: UITableViewRowAnimation.Fade)
self.tableView.endUpdates()

Error when deleting item from tableview in swift

这可能对您有所帮助:)。