2015-07-20 81 views
0

我試圖從TableView和名爲「Books」的實體中刪除項目。然而,我不知道我是否在遙遠的軌道上。當我嘗試此代碼:同時從tableview行和核心數據中刪除項目

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

     var appdel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
     var context:NSManagedObjectContext = appdel.managedObjectContext! 
     var request = NSFetchRequest(entityName: "Books") 

     if editingStyle == UITableViewCellEditingStyle.Delete { 

      addBook.myBooks.removeAtIndex(indexPath.row) 
      tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) 
      context.deleteObject(addBook.myBooks[indexPath.row] as! NSManagedObject) 

     } 
    } 

我得到的最後一行寫着警告「從‘字符串’到不相關類型的‘NSManagedObject’總是失敗演員。」有誰知道我如何解決這個問題?我讀過你可以使用fetchedResultsController輕鬆處理表格中的核心數據,但我是編程新手,發現通常在設置核心數據時這種方法有點混亂。是否需要管理我的TableView中的數據的fetchedResultsController?

回答

2

後從你的錯誤,它聽起來就像是addBook.myBooks字符串數組。

目前的問題是deleteObject不適用於字符串,它適用於託管對象 - 即NSManagedObject的實例或NSManagedObject的子類。你不能像這樣從核心數據中刪除一個字符串,你必須刪除與該字符串對應的被管理對象。該錯誤明確告訴您as! NSManagedObject對字符串不起作用,因爲字符串與管理對象完全不同。

[這也是你在indexPath.row通過removeAtIndex去除串,再後來嘗試使用在indexPath.row你只是刪除了字符串中的問題,但在這裏,這不是真正的問題。]

什麼您需要做的是找到與您要刪除的表視圖行對應的託管對象,然後將其傳遞給deleteObject。如果沒有您的視圖控制器是如何工作的,這是不可能說究竟你會怎麼做,但也有很清楚兩件事情更全面:

  1. 那些第一三線在你的方法沒有做任何事情有用。切斷他們 - 即使你讓他們工作,他們在這裏也會是錯誤的做法。您不希望必須獲取您在此處刪除的管理對象。當你達到這個方法時,你應該已經知道了足夠的把它刪除。

  2. 這不是必要使用NSFetchedResultsController將核心數據與表視圖。但是如果你對編程不熟悉,那麼如果你使用它,可能會發現更容易。

0

嘗試保存您的上下文DeleteObject的

context.deleteObject(addBook.myBooks![indexPath.row]) 
      addBook.myBooks.removeAtIndex(indexPath.row) 

      do { 
       try context.save() 
      } 
      catch { 
       print("Error") 
      } 

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


     } 
相關問題