2014-09-03 21 views
2

我正在使用Core Data。執行提取和重新加載後,UITableView應用程序崩潰。核心數據值在swift中訪問錯誤

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? 
    { 
     var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks 
     cell.textLabel.text = tasks?.desc 

     return cell 
    } 

我知道錯誤是在這一部分 - >

tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks 

閱讀一些StackOverflow的問題後,我在我現有的cellForRowAtIndexPath的UITableView委託方法添加該代碼。

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? 
    { 
     var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     var array : NSArray = self.fetchedResultsController.fetchedObjects as NSArray 
     cell.textLabel.text = array.valueForKeyPath("desc") as NSString 

     return cell 
    } 

這個應用程序再次崩潰。

var array : NSArray = self.fetchedResultsController.fetchedObjects as NSArray 

我這段代碼

println(self.fetchedResultsController.fetchedObjects) 

[<NSManagedObject: 0x16debcc0> (entity: Tasks; id: 0x16dd02f0 <x-coredata://A5AEB550-EB6D-4A47-9F6F-2F3AA49CA6BF/Tasks/p2> ; data: { 
    desc = gghjg; 
}), <NSManagedObject: 0x16ebb1d0> (entity: Tasks; id: 0x16e8cda0 <x-coredata://A5AEB550-EB6D-4A47-9F6F-2F3AA49CA6BF/Tasks/p1> ; data: { 
    desc = gxshli; 
})] 

我不知道什麼這個問題的印刷本。我按照這篇文章中的步驟Core Data Example

如果有人知道這是什麼問題,請讓我知道。謝謝。

這是崩潰報告的圖像。 enter image description here

這裏是我的ViewController源文件類的完整代碼。

import UIKit 
import CoreData 

class MaterTableViewController: UITableViewController, UIAlertViewDelegate, NSFetchedResultsControllerDelegate { 

    var fetchedResultsController : NSFetchedResultsController = NSFetchedResultsController() 
    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext 
    var tasks : Tasks? = nil 


    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: Selector("insertNewObject")) 

     // Update the ViewDidLoad method of TableViewController to populate fetchedResultController variable and set the delegate to self and call the function to retrieve the results. 

     fetchedResultsController = getFetchedResultController() 
     fetchedResultsController.delegate = self 
     fetchedResultsController.performFetch(nil) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    // MARK: - Core Data Methods 

    func insertNewObject() 
    { 
     if tasks != nil 
     { 
      self.editTasks() 
     } 
     else 
     { 
      var alertView : UIAlertView = UIAlertView() 
      alertView.title = "Add Note" 
      alertView.alertViewStyle = UIAlertViewStyle.PlainTextInput 
      alertView.addButtonWithTitle("Cancel") 
      alertView.addButtonWithTitle("Save") 
      alertView.delegate = self 
      alertView.show() 

     } 

    } 

    func alertView(alertView: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) 
    { 
     switch buttonIndex 
      { 
     case 0 : alertView .dismissWithClickedButtonIndex(buttonIndex, animated: true) 
     case 1 : 
      tempData = alertView.textFieldAtIndex(0).text 
      self.saveThisValue(tempData) 
     default : println("Nothin") 
     } 
    } 

    var tempData : NSString = NSString() 

    func editTasks() 
    { 
     tasks?.desc = tempData 
     managedObjectContext?.save(nil) 
    } 

    func saveThisValue(input : NSString) 
    { 

     let entityDescription = NSEntityDescription.entityForName("Tasks", inManagedObjectContext: managedObjectContext) 
     let task = Tasks(entity: entityDescription, insertIntoManagedObjectContext: managedObjectContext) 
     task.desc = input 
     managedObjectContext?.save(nil) 

    } 

    func getFetchedResultController() -> NSFetchedResultsController 
    { 
     fetchedResultsController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: nil, cacheName: nil) 
     return fetchedResultsController 
    } 

    func taskFetchRequest() -> NSFetchRequest 
    { 
     let fetchRequest = NSFetchRequest(entityName: "Tasks") 
     let sortDecriptor = NSSortDescriptor(key: "desc", ascending: true) 
     fetchRequest.sortDescriptors = [sortDecriptor] 
     return fetchRequest 
    } 

    // MARK: - Table view data source 

    override func numberOfSectionsInTableView(tableView: UITableView!) -> Int { 

     return fetchedResultsController.sections.count 
    } 

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 


     return fetchedResultsController.sections[section].numberOfObjects 
    } 


    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? 
    { 
     var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

     tasks = self.fetchedResultsController.objectAtIndexPath(indexPath) as Tasks 
     cell.textLabel.text = tasks?.desc 

     return cell 
    } 


    func controllerDidChangeContent(controller: NSFetchedResultsController!) 
    { 
     fetchedResultsController.performFetch(nil) 
     tableView.reloadData() 
    } 
} 
+0

你有字符串列表結果數組,但'cellForRowAtInde xPath'只是一個結果 - 所以你需要使用'indexPath.row'從數組中獲取特定的元素 – Paulw11 2014-09-03 04:43:12

+0

@ Paulw11我試過了。但再次顯示相同的錯誤。你可以在這裏發佈一些代碼嗎? – 2014-09-03 05:21:28

+0

你收到的是什麼消息? – Paulw11 2014-09-03 05:28:15

回答

0

嘗試

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? 
{ 
    var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

    let task = self.fetchedResultsController.objectAtIndexPath(indexPath.row) as Tasks 
    cell.textLabel.text = task.desc 


    return cell 
} 
+0

我做到了。它在這一行顯示錯誤 - >讓任務= self.fetchedResultsController.objectAtIndexPath(indexPath.row)作爲任務// NSNumber不是NSIndexPath的子類型。 – 2014-09-03 06:47:09

0

我在最近的應用程序使用

let ob = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject 
var title : String = ob.valueForKey("keyname")!.description 

,標題是從NSManaged對象

傑克遜