retrieving core data into tableview cells swift

前端 未结 1 1211
孤街浪徒
孤街浪徒 2020-12-15 10:27

I am trying to simply store and retrieve CoreData (something that I\'ve done successfully before with swift). I was getting a nil for data, but now (not sure what changed) I

相关标签:
1条回答
  • 2020-12-15 11:26

    When using core data and a tableview, you should use NSFetchedResultsController. This essentially retrieves data from core data and organizes it by section and indexPath so it can easily be set as the data source of the tableView. Here is a complete implementation of a potential UITableViewController that conforms to NSFetchedResultsControllerDelegate:

    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()
        }
    }
    

    See a sample GitHub project here.

    0 讨论(0)
提交回复
热议问题