2016-12-27 5 views
1

Я создал список сотрудников и отобразил его tableView. Пользователь должен иметь возможность удалить сотрудника при выборе действия удаления. Я тестировал его на массиве, он работает, однако, когда я изменил его на основные данные, он разбился. Безне в состоянии использовать tableView.deleteRowsAtIndexPaths с coreData

self.tableView.deleteRowsAtIndexPaths ([indexPath], withRowAnimation: .Automatic)

приложение, казалось, работать, но удалены строки все еще существуют с пустыми этикетки (Without the name and title)

.

FavEmployeeViewController.swift

//MARK:- Table Functions 
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    if searchController.active && searchController.searchBar.text != "" { 
     return filteredEmployees.count 
    } 
    //coredata 
    return employeeStore.testCoreData.count 
} 

//MARK:- TEST coredata 
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // Create an instance of UITableViewCell, with default appearance 
    let cell = tableView.dequeueReusableCellWithIdentifier("EmployeeCell", forIndexPath: indexPath) as! EmployeeCell 
    cell.updateLabels() 

    let item = employeeStore.testCoreData[indexPath.row] 

    cell.nameLabel.text = item.valueForKey("name") as? String 
    cell.jobPosition.text = item.valueForKey("title") as? String 

    return cell 

} 


//MARK:- Edit bar Button 
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    // If the table view is asking to commit a delete command... 
    if editingStyle == .Delete { 
     let item = employeeStore.testCoreData[indexPath.row] 
     let title = "Delete \(item.valueForKey("name") as! String)?" 
     let message = "Are you sure you want to delete this item?" 

     let ac = UIAlertController(title: title, message: message, preferredStyle: .ActionSheet) 
     let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
     ac.addAction(cancelAction) 

     let deleteAction = UIAlertAction(title: "Delete", style: .Destructive, 
             handler: { (action) -> Void in 
              // Remove the item from the store 
              debugPrint("index", indexPath.row) 
              self.employeeStore.testremoveEmployee(indexPath.row) 
              // Also remove that row from the table view with an animation 
              self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
                          debugPrint("index", indexPath.row) 
     }) 
     ac.addAction(deleteAction) 

     // Present the alert controller 
     presentViewController(ac, animated: true, completion: nil) 
    } 
} 

override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) { 
    // Update the model 
    employeeStore.moveEmployeeAtIndex(sourceIndexPath.row, toIndex: destinationIndexPath.row) 
} 

EmployeeStore.swift

import UIKit 
import CoreData 

class EmployeeStore { 
    //MARK:-Coredata 
    var testCoreData = [NSManagedObject]() //storing favs entities 

... 

//MARK:- Test delete coreData -> removeFavEmployee 
func testremoveEmployee(index: Int) { 
    debugPrint("testremoveEmployee") 
    //retrieve from CoreData 
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let managedContext = appDelegate.managedObjectContext 
    let employee = testCoreData[index] 

    let _: NSError! = nil 
    do { 
     managedContext.deleteObject(employee) 
     debugPrint("manage2delete") 
     try managedContext.save() 

    } catch { 
     print("error : \(error)") 
    } 
} 
+0

если вы нажмете на ** (без названия и названия) **, вы сможете увидеть изображение ошибки. – xxmilcutexx

+0

Не удаляйте строку tableView. Удалите строку в источнике данных и перезагрузите данные таблицы. – zisoft

+0

добавьте эту строку после employeeStore.testCoreData.removeAtIndex (sourceIndexPath.row) – Chandan

ответ

1

Вы должны также удалить объект из массива self.employeeStore вы только что удалили его из CoreData поэтому добавьте self.employeeStore.remove(at: indexPath.row) после удаления объекта из CoreData.

self.employeeStore.testremoveEmployee(indexPath.row) 

// Also remove that object from Array 
self.employeeStore. testcoreData.removeAtIndex(indexPath.row) 

// Now remove that row from the table view with an animation 
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic) 
+0

Спасибо. Работает. Проблема заключалась в том, что объектом из основных данных было удаление, но в массиве все еще существовало. – xxmilcutexx

+0

'self.employeeStore.removeAtIndex (indexPath.row)' я изменил его на _ // Также удаляю этот объект из массива self.employeeStore.testcoreData.removeAtIndex (indexPath.row) _ для его работы. – xxmilcutexx

+0

@xxmilcutexx Приветственный помощник :) n Отредактированный ответ для этого :) –

Смежные вопросы