2015-10-05 4 views
1

Удаленная функциональность удаления отлично работает, но я не могу добавить анимацию, я пробовал все, что мог, но ничего не работал. Всякий раз, когда я добавляю код для анимации, приложение вылетает, когда ячейка удаляется. Если вы снова загрузите приложение, вы обнаружите, что запись была удалена, что означает, что удаление было успешным.проведите по экрану, чтобы удалить анимацию ячейки UITableView не работает в swift 2

Ошибка аварии я получаю это:

Invalid обновление: неверное число строк в разделе 0. Число строк, содержащихся в существующем разделе после обновления (1) должен быть равен к числу строк, содержащихся в этом разделе, перед обновлением (1) , плюс или минус количество строк, вставленных или удаленных из , в этот раздел (вставлено 0, 1 удалено) и плюс или минус число строк, перемещенных в или из этого раздела (0 перемещено, 0 выведено).

анимации блоков кода я попытался были:

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

Я также попытался удалить эти коды и он не работал слишком:

fetchAndSetResults() treatmentProtocolsTableView.reloadData()

Весь код в быстром файле находится здесь, я закомментировал блоки анимации, и он работает правильно.

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

      } 
    } 


} 

Я ценю вашу помощь

ответ

7

Вам нужно инкапсулировать внутри beginUpdates() и endUpdates(). Кроме того, обновить модель данных, которая используется для загрузки данных в таблице:

self.tableView.beginUpdates() 
self.txProtocols.removeObjectAtIndex(indexPath.row) // Check this out 
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
self.tableView.endUpdates() 
+0

Спасибо Абхинав, Инкапсуляция «если editingstyle» код внутри начинаются и заканчиваются обновления наряду с добавлением 3-й строки кода в вашем решении работал. Однако мне пришлось снять вторую строчку. Я не знаю, была ли это лучшей практикой, так как я новичок в быстром, но это работает. Еще раз спасибо! –

0

На основании принятого ответа на Abhinav, здесь было мое решение (Swift 3). Это реализовано в моем NSFetchedResultsControllerDelegate:

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    self.tableView.beginUpdates() 
} 

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) { 
    ... 
    case .delete: 
      // Delete from tableView 
      removeFromSetsToDisplayByID(removeThisSet: myObject) 
      tableView.deleteRows(at: [indexPath!], with: UITableViewRowAnimation.automatic) 
    ... 
} 

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) { 
    self.tableView.endUpdates() 
} 
Смежные вопросы