滑动删除UITableView单元格动画在swift 2中不起作用

Ram*_*oun 1 animation core-data uitableview ios swift2

滑动删除功能工作正常,但我无法添加动画,我尝试了一切,但没有任何效果.每当我添加动画代码时,应用程序会在删除单元格时崩溃.如果再次加载应用程序,您会发现该记录已被删除,这意味着删除成功.

我得到的崩溃错误是:

无效更新:第0节中的行数无效.更新(1)后现有部分中包含的行数必须等于更新前的该部分中包含的行数(1),加上或减去数字从该部分插入或删除的行(0已插入,1已删除)和加或减移入或移出该部分的行数(0移入,0移出).

我试过的动画代码块是:

        //1
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        //2
        tableView.deleteRowsAtIndexPaths([indexPath],
            withRowAnimation: UITableViewRowAnimation.Automatic)
Run Code Online (Sandbox Code Playgroud)

我也试图删除这些代码,它也不起作用:

fetchAndSetResults()treatmentProtocolsTableView.reloadData()

swift文件中的整个代码都在这里,我注释掉了动画块,它运行正常.

import UIKit
import CoreData

class Tx_Protocols: UIViewController, UITableViewDataSource, UITableViewDelegate {

    //MARK: declaratoins.
    weak var secureTextAlertAction: UIAlertAction?

    //MARK: Core data related
    var txProtocols = [TreatmentProtocolData]()
    var selectedProtocol : TreatmentProtocolData? = nil

    @IBOutlet weak var treatmentProtocolsTableView: UITableView!


    //When button + is clicked, segue show add tx VC is initiated.
    @IBAction func plusButtonAddTxProtocol(sender: AnyObject) {
        self.performSegueWithIdentifier("showAddTxVC", sender: self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchAndSetResults()

        treatmentProtocolsTableView.delegate = self
        treatmentProtocolsTableView.dataSource = self
    }

    //When this is used, the data shows with a slight lag, slower.
    override func viewDidAppear(animated: Bool) {
        fetchAndSetResults()
        treatmentProtocolsTableView.reloadData()
    }

    //This is how you catch the app delegate core data fnxnality, GRABBING THE PROPERTY IN APP DELEGATE
    func fetchAndSetResults() {
        let app = UIApplication.sharedApplication().delegate as! AppDelegate
        let context = app.managedObjectContext
        let fetchRequest  = NSFetchRequest(entityName: "TreatmentProtocolData")

        do {
            let results = try context.executeFetchRequest(fetchRequest)
            self.txProtocols = results as! [TreatmentProtocolData]
        } catch let err as NSError {
            print(err.debugDescription)
        }
    }



    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier:"Cell")
        cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        cell.textLabel!.adjustsFontSizeToFitWidth = true
        cell.textLabel!.font = UIFont.boldSystemFontOfSize(17)

        let treatmentProtocol = txProtocols[indexPath.row]
        cell.textLabel!.text = treatmentProtocol.title
        cell.imageView?.image = treatmentProtocol.getTxProtocolImage()

        return cell
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return txProtocols.count
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)
        self.selectedProtocol = txProtocols[indexPath.row]
        self.performSegueWithIdentifier("showTxProtocol", sender: self)


    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

        if segue.identifier == "showTxProtocol" {
        let detailVC = segue.destinationViewController as! ShowTxProtocolDetailVC
        detailVC.txProtocol = self.selectedProtocol
        }
    }


    //MARK: Edittable table, delete button functionality.
    func tableView(tableView: UITableView,
        canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
            return true
    }

    func tableView(tableView: UITableView,
        commitEditingStyle
        editingStyle: UITableViewCellEditingStyle,
        forRowAtIndexPath indexPath: NSIndexPath) {

            if editingStyle == UITableViewCellEditingStyle.Delete {

                let app = UIApplication.sharedApplication().delegate as! AppDelegate
                let context = app.managedObjectContext
                //1
                let protocolToRemove =
                txProtocols[indexPath.row]

                //2
                context.deleteObject(protocolToRemove)

                //3
                do {
                    try context.save()
                } catch let error as NSError {
                    print("Could not save: \(error)")
                }

//                //1
//                tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
//                //2
//                tableView.deleteRowsAtIndexPaths([indexPath],
//                    withRowAnimation: UITableViewRowAnimation.Automatic)

                fetchAndSetResults()
                treatmentProtocolsTableView.reloadData()

            }
    }


}
Run Code Online (Sandbox Code Playgroud)

我感谢您的帮助

Abh*_*nav 7

你需要封装在里面beginUpdates()和endUpdates().此外,更新用于加载表视图的数据模型:

self.tableView.beginUpdates()
self.txProtocols.removeObjectAtIndex(indexPath.row) // Check this out 
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
self.tableView.endUpdates()
Run Code Online (Sandbox Code Playgroud)