Search code examples
iosswiftcore-datasavensfetchrequest

CoreData - TableView does not get updated


So, I'm struggling to learn how to handle CoreData properly.

Here is my code:

import UIKit
import CoreData

class IngredientsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate {

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
    var fetchedResultsController: NSFetchedResultsController?


    override func viewDidLoad() {
        super.viewDidLoad()

        fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchIngredients(), managedObjectContext: moc!, sectionNameKeyPath: nil, cacheName: nil)
        fetchedResultsController?.delegate = self
        fetchedResultsController?.performFetch(nil)

    }

    func fetchIngredients() -> NSFetchRequest {

        var fetchRequest = NSFetchRequest(entityName: "DetailsForRecipe")
        let sortDescriptor = NSSortDescriptor(key: "ingredients", ascending: true)

        fetchRequest.predicate = nil
        fetchRequest.sortDescriptors = [sortDescriptor]
        fetchRequest.fetchBatchSize = 20

        return fetchRequest

    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fetchedResultsController?.sections?[section].numberOfObjects ?? 0
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("ingCell", forIndexPath: indexPath) as! UITableViewCell
        if let ingCell = fetchedResultsController?.objectAtIndexPath(indexPath) as? DetailsForRecipe {
            cell.textLabel?.text = ingCell.ingredients
        }
        return cell
    }
}

and

import UIKit
import CoreData

class SingleIngredientViewController: UIViewController {

    @IBOutlet var ingField: UITextField!
    var moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func addIng(sender: AnyObject) {

        let entityDescription = NSEntityDescription.entityForName("DetailsForRecipe", inManagedObjectContext: moc!)
        let details = DetailsForRecipe(entity: entityDescription!, insertIntoManagedObjectContext: moc)
        details.ingredients = ingField.text

        var error: NSError?
        moc?.save(&error)

        if let err = error {
            var status = err.localizedFailureReason
            println(status)
        } else {
            println("Ingredient \(ingField.text) saved successfully!")
        }

        if let navigation = navigationController {
            navigation.popViewControllerAnimated(true)
        }
    }
}

My model:

import Foundation
import CoreData

    class DetailsForRecipe: NSManagedObject {

        @NSManaged var name: String
        @NSManaged var ingredients: String
        @NSManaged var image: NSData

    }

The app should insert the ingredient name in the text field, save it into coreData, then it should be retrieved in the table view. When I text the ingredient name and press "add", the prinln message says it was successfully saved, but the table view does not update.

What am I doing wrong here? I'm not a developer, I've read many tutorials on how to do this, but it is very confusing! So forgive me about this. Thanks in advance!


Solution

  • I haven't read your full source code, but by doing an immediate glance, I don't see that you've called the tableview's reloadData function. If you don't have an IBOutlet set up for your table view, you will want to do that and then call reloadData() on it.