将核心数据快速地检索到tableview单元格中

我试图简单地存储和检索CoreData(我以前用swift成功完成的)。 我得到一个零数据,但现在(不知道是什么改变)我没有得到一个错误,只是没有显示在tableview中。 我不确定在存储或检索对象时是否存在问题。 我跟着我是如何在另一个应用程序中尽可能地做到这一点的,但似乎有一些根本性的东西,我没有得到。 这是我的。

我的模特:

import Foundation import CoreData @objc(DataModel) class DataModel: NSManagedObject { @NSManaged var itemName: String @NSManaged var quantity: NSNumber @NSManaged var price: NSNumber } 

在我想保存数据的文本字段的静态单元格tableviewcontroller:

 import UIKit import CoreData class NewItemTableViewController: UITableViewController { @IBOutlet weak var itemNameTextField: UITextField! @IBOutlet weak var itemPriceTextField: UITextField! @IBOutlet weak var itemQuantityTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } @IBAction func saveButton(sender: AnyObject) { //CoreData let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext! let entity = NSEntityDescription.entityForName("Item", inManagedObjectContext: managedContext) var newItem = DataModel(entity: entity!, insertIntoManagedObjectContext: managedContext) newItem.itemName = itemNameTextField.text //newItem.price = itemPriceTextField.text //newItem.quantity = itemQuantityTextField managedContext.save(nil) self.navigationController?.popToRootViewControllerAnimated(true) } @IBAction func cancelButton(sender: AnyObject) { self.navigationController?.popToRootViewControllerAnimated(true) } 

并在我的tableviewcontroller,我想检索数据dynamic单元格中显示:

 class ItemListTableViewController: UITableViewController { var items : Array<AnyObject> = [] override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - Table view data source override func numberOfSectionsInTableView(tableView: UITableView) -> Int { // #warning Potentially incomplete method implementation. // Return the number of sections. return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // #warning Incomplete method implementation. // Return the number of rows in the section. return items.count } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let CellID: NSString = "cell" var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell var data: NSManagedObject = items[indexPath.row] as NSManagedObject var itemName = data.valueForKey("itemName") as String var price = data.valueForKey("price") as NSNumber var quantity = data.valueForKey("quantity") as NSNumber cell.textLabel!.text! = "\(itemName)" cell.detailTextLabel!.text! = "Price: \(price) - Quantity: \(quantity)" return cell } 

任何帮助,我可能会错过这里的某个概念,将不胜感激! 谢谢。

更新:所以我已经重做了我的代码,以模仿@Bluehound的build议。 但我仍然得到一个错误:不知道如何解决它。 在这里输入图像说明

当使用核心数据和tableview时,你应该使用NSFetchedResultsController 。 这基本上是从核心数据中检索数据,并通过section和indexPath来组织它,因此可以很容易地将其设置为tableView的数据源。 下面是一个符合NSFetchedResultsControllerDelegate的潜在UITableViewController的完整实现:

 import Foundation import UIKit import CoreData class HomeViewController: UITableViewController, NSFetchedResultsControllerDelegate { let managedObjectContext: NSManagedObjectContext? = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext var fetchedResultsController: NSFetchedResultsController? override func viewDidLoad() { super.viewDidLoad() fetchedResultsController = NSFetchedResultsController(fetchRequest: allEmployeesFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) fetchedResultsController?.delegate = self fetchedResultsController?.performFetch(nil) } func allEmployeesFetchRequest() -> NSFetchRequest { var fetchRequest = NSFetchRequest(entityName: "Employee") let sortDescriptor = NSSortDescriptor(key: "nameLast", ascending: true) fetchRequest.predicate = nil fetchRequest.sortDescriptors = [sortDescriptor] fetchRequest.fetchBatchSize = 20 return fetchRequest } //MARK: UITableView Data Source and Delegate Functions override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return fetchedResultsController?.sections?.count ?? 0 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return fetchedResultsController?.sections?[section].numberOfObjects ?? 0 } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("HomeCell", forIndexPath: indexPath) as UITableViewCell if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Employee { cell.textLabel?.text = "\(cellContact.nameLast), \(cellContact.nameFirst)" } return cell } //MARK: NSFetchedResultsController Delegate Functions func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) { switch type { case NSFetchedResultsChangeType.Insert: tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Fade) break case NSFetchedResultsChangeType.Delete: tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: UITableViewRowAnimation.Fade) break case NSFetchedResultsChangeType.Move: break case NSFetchedResultsChangeType.Update: break default: break } } override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { if editingStyle == .Delete { } switch editingStyle { case .Delete: managedObjectContext?.deleteObject(fetchedResultsController?.objectAtIndexPath(indexPath) as Employee) managedObjectContext?.save(nil) case .Insert: break case .None: break } } func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) { switch type { case NSFetchedResultsChangeType.Insert: tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!), withRowAnimation: UITableViewRowAnimation.Fade) break case NSFetchedResultsChangeType.Delete: tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!), withRowAnimation: UITableViewRowAnimation.Fade) break case NSFetchedResultsChangeType.Move: tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!), withRowAnimation: UITableViewRowAnimation.Fade) tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!), withRowAnimation: UITableViewRowAnimation.Fade) break case NSFetchedResultsChangeType.Update: tableView.cellForRowAtIndexPath(indexPath!) break default: break } } func controllerWillChangeContent(controller: NSFetchedResultsController) { tableView.beginUpdates() } func controllerDidChangeContent(controller: NSFetchedResultsController) { tableView.endUpdates() } } 

在这里看到一个示例GitHub项目。