ios – 将核心数据检索到表视图单元格中

前端之家收集整理的这篇文章主要介绍了ios – 将核心数据检索到表视图单元格中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图简单地存储和检索CoreData(我以前用 swift成功的东西).我的数据没有数据,但现在(不知道是什么改变)我没有得到错误,只是没有显示在表格中.我不知道是否存储或检索对象的问题.我已经跟随我在另一个应用程序中尽可能的做了,但似乎有一些根本的事情,我没有得到.这是我有的

我的型号:

  1. import Foundation
  2. import CoreData
  3.  
  4. @objc(DataModel)
  5. class DataModel: NSManagedObject {
  6.  
  7. @NSManaged var itemName: String
  8. @NSManaged var quantity: NSNumber
  9. @NSManaged var price: NSNumber
  10.  
  11. }

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

  1. import UIKit
  2. import CoreData
  3.  
  4. class NewItemTableViewController: UITableViewController {
  5.  
  6. @IBOutlet weak var itemNameTextField: UITextField!
  7. @IBOutlet weak var itemPriceTextField: UITextField!
  8. @IBOutlet weak var itemQuantityTextField: UITextField!
  9.  
  10.  
  11. override func viewDidLoad() {
  12. super.viewDidLoad()
  13.  
  14. }
  15.  
  16. override func didReceiveMemoryWarning() {
  17. super.didReceiveMemoryWarning()
  18. // Dispose of any resources that can be recreated.
  19. }
  20.  
  21.  
  22. @IBAction func saveButton(sender: AnyObject) {
  23. //CoreData
  24. let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
  25. let managedContext : NSManagedObjectContext = appDelegate.managedObjectContext!
  26. let entity = NSEntityDescription.entityForName("Item",inManagedObjectContext: managedContext)
  27.  
  28. var newItem = DataModel(entity: entity!,insertIntoManagedObjectContext: managedContext)
  29.  
  30.  
  31. newItem.itemName = itemNameTextField.text
  32. //newItem.price = itemPriceTextField.text
  33. //newItem.quantity = itemQuantityTextField
  34. managedContext.save(nil)
  35.  
  36. self.navigationController?.popToRootViewControllerAnimated(true)
  37.  
  38.  
  39. }
  40. @IBAction func cancelButton(sender: AnyObject) {
  41. self.navigationController?.popToRootViewControllerAnimated(true)
  42. }

在我的tableviewcontroller中,我想在动态单元格中检索数据:

  1. class ItemListTableViewController: UITableViewController {
  2.  
  3. var items : Array<AnyObject> = []
  4.  
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. }
  8.  
  9.  
  10.  
  11. override func didReceiveMemoryWarning() {
  12. super.didReceiveMemoryWarning()
  13. // Dispose of any resources that can be recreated.
  14. }
  15.  
  16. // MARK: - Table view data source
  17.  
  18. override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
  19. // #warning Potentially incomplete method implementation.
  20. // Return the number of sections.
  21. return 1
  22. }
  23.  
  24. override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
  25. // #warning Incomplete method implementation.
  26. // Return the number of rows in the section.
  27. return items.count
  28. }
  29.  
  30.  
  31. override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  32.  
  33. let CellID: NSString = "cell"
  34. var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell
  35. var data: NSManagedObject = items[indexPath.row] as NSManagedObject
  36.  
  37.  
  38. var itemName = data.valueForKey("itemName") as String
  39. var price = data.valueForKey("price") as NSNumber
  40. var quantity = data.valueForKey("quantity") as NSNumber
  41.  
  42.  
  43. cell.textLabel!.text! = "\(itemName)"
  44. cell.detailTextLabel!.text! = "Price: \(price) - Quantity: \(quantity)"
  45.  
  46. return cell
  47.  
  48. }

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

更新:所以我重写了我的代码,以@Bluehound的建议后建模.但我仍然收到一个错误:不知道如何解决它.

解决方法

使用核心数据和tableview时,应该使用NSFetchedResultsController.这本质上是从核心数据中检索数据,并通过section和indexPath进行组织,因此可以方便地将其设置为tableView的数据源.以下是符合NSFetchedResultsControllerDelegate的潜在UITableViewController的完整实现:
  1. import Foundation
  2. import UIKit
  3. import CoreData
  4.  
  5.  
  6. class HomeViewController: UITableViewController,NSFetchedResultsControllerDelegate {
  7.  
  8. let managedObjectContext: NSManagedObjectContext? = (UIApplication.sharedApplication().delegate as? AppDelegate)?.managedObjectContext
  9.  
  10. var fetchedResultsController: NSFetchedResultsController?
  11.  
  12. override func viewDidLoad() {
  13. super.viewDidLoad()
  14.  
  15. fetchedResultsController = NSFetchedResultsController(fetchRequest: allEmployeesFetchRequest(),managedObjectContext: managedObjectContext!,sectionNameKeyPath: nil,cacheName: nil)
  16. fetchedResultsController?.delegate = self
  17. fetchedResultsController?.performFetch(nil)
  18.  
  19.  
  20. }
  21.  
  22. func allEmployeesFetchRequest() -> NSFetchRequest {
  23.  
  24. var fetchRequest = NSFetchRequest(entityName: "Employee")
  25. let sortDescriptor = NSSortDescriptor(key: "nameLast",ascending: true)
  26.  
  27. fetchRequest.predicate = nil
  28. fetchRequest.sortDescriptors = [sortDescriptor]
  29. fetchRequest.fetchBatchSize = 20
  30.  
  31. return fetchRequest
  32. }
  33.  
  34. //MARK: UITableView Data Source and Delegate Functions
  35. override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
  36. return fetchedResultsController?.sections?.count ?? 0
  37. }
  38.  
  39. override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
  40.  
  41. return fetchedResultsController?.sections?[section].numberOfObjects ?? 0
  42. }
  43.  
  44. override func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  45. let cell = tableView.dequeueReusableCellWithIdentifier("HomeCell",forIndexPath: indexPath) as UITableViewCell
  46.  
  47. if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Employee {
  48. cell.textLabel?.text = "\(cellContact.nameLast),\(cellContact.nameFirst)"
  49.  
  50. }
  51.  
  52.  
  53. return cell
  54. }
  55.  
  56. //MARK: NSFetchedResultsController Delegate Functions
  57. func controller(controller: NSFetchedResultsController,didChangeSection sectionInfo: NSFetchedResultsSectionInfo,atIndex sectionIndex: Int,forChangeType type: NSFetchedResultsChangeType) {
  58.  
  59. switch type {
  60. case NSFetchedResultsChangeType.Insert:
  61. tableView.insertSections(NSIndexSet(index: sectionIndex),withRowAnimation: UITableViewRowAnimation.Fade)
  62. break
  63. case NSFetchedResultsChangeType.Delete:
  64. tableView.deleteSections(NSIndexSet(index: sectionIndex),withRowAnimation: UITableViewRowAnimation.Fade)
  65. break
  66. case NSFetchedResultsChangeType.Move:
  67. break
  68. case NSFetchedResultsChangeType.Update:
  69. break
  70. default:
  71. break
  72. }
  73. }
  74.  
  75. override func tableView(tableView: UITableView,commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath) {
  76. if editingStyle == .Delete {
  77. }
  78.  
  79. switch editingStyle {
  80. case .Delete:
  81. managedObjectContext?.deleteObject(fetchedResultsController?.objectAtIndexPath(indexPath) as Employee)
  82. managedObjectContext?.save(nil)
  83. case .Insert:
  84. break
  85. case .None:
  86. break
  87. }
  88.  
  89. }
  90.  
  91. func controller(controller: NSFetchedResultsController,didChangeObject anObject: AnyObject,atIndexPath indexPath: NSIndexPath?,forChangeType type: NSFetchedResultsChangeType,newIndexPath: NSIndexPath?) {
  92.  
  93. switch type {
  94. case NSFetchedResultsChangeType.Insert:
  95. tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
  96. break
  97. case NSFetchedResultsChangeType.Delete:
  98. tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
  99. break
  100. case NSFetchedResultsChangeType.Move:
  101. tableView.deleteRowsAtIndexPaths(NSArray(object: indexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
  102. tableView.insertRowsAtIndexPaths(NSArray(object: newIndexPath!),withRowAnimation: UITableViewRowAnimation.Fade)
  103. break
  104. case NSFetchedResultsChangeType.Update:
  105. tableView.cellForRowAtIndexPath(indexPath!)
  106. break
  107. default:
  108. break
  109. }
  110. }
  111.  
  112. func controllerWillChangeContent(controller: NSFetchedResultsController) {
  113. tableView.beginUpdates()
  114. }
  115.  
  116. func controllerDidChangeContent(controller: NSFetchedResultsController) {
  117. tableView.endUpdates()
  118. }
  119. }

See a sample GitHub project here.

猜你在找的iOS相关文章