2015-07-29 2 views
0

Итак, я пытаюсь научиться правильно обращаться с CoreData.CoreData - TableView не обновляется

Вот мой код:

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

и

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

Моя модель:

import Foundation 
import CoreData 

    class DetailsForRecipe: NSManagedObject { 

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

    } 

приложение должно вставить имя ингредиента в текстовом поле, сохранить его в CoreData , то он должен быть извлечен в виде таблицы. Когда я текст имя ингредиента и нажмите «добавить», сообщение prinln говорит, что он был успешно сохранен, но представление таблицы не обновляется.

Что я здесь делаю неправильно? Я не разработчик, я прочитал много руководств о том, как это сделать, но это очень запутанно! Так простите меня об этом. Спасибо заранее!

ответ

1

Я не читал ваш полный исходный код, но, сделав немедленный взгляд, я не вижу, что вы вызвали функцию reloadData tableview. Если у вас нет IBOutlet, настроенного для вашего представления в таблице, вам нужно это сделать, а затем называть reloadData().

+0

Работает как шарм !!! Большое спасибо! –

0

Звоните reloadData() на ваш рабочий стол после изменения.

+0

Где я могу позвонить reloadData()? В viewDidLoad он вызывает ошибку –

+0

Я не уверен, как эти два контроллера представлений связаны, но так или иначе 'SingleIngredientViewController' должен будет вызывать метод на' IngredientsViewController', который в свою очередь вызывает 'self.tableView.reloadData() '. Вы можете создать отношение делегирования, используя протокол под названием «IngredientsViewControllerDelegate», с методом «didAddDetail», а затем «IngredientsViewController» реализует его, а «SingleIngredientViewController» вызывает его. –

Смежные вопросы