2014-12-16 5 views
10

Я пытаюсь просто хранить и извлекать CoreData (что-то, что я сделал успешно раньше, с быстрым). Я получал нуль для данных, но теперь (не знаю, что изменилось). Я не получаю сообщение об ошибке, просто ничего не отображается в таблице. Я не уверен, что это проблема при хранении или извлечении объекта. Я следил за тем, как я сделал это в другом приложении, насколько это возможно, но, похоже, есть некоторые фундаментальные вещи, которые я не получаю. Вот что у меня есть.Получение данных ядра в ячейки tableview swift

Моя модель:

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, что я хочу, чтобы извлечь для передачи данных показать в динамических ячейках:

Любая помощь по концепции Возможно, я пропустил где-то здесь было бы оценено! Благодарю.

Обновление: поэтому я переделал свой код, который будет смоделирован после предложения @Bluehound. но я все еще получаю сообщение об ошибке: не знаю, как это исправить. enter image description here

+0

Как и где ваш '' деталей массив заполняется? – pbasdf

ответ

17

При использовании данных ядра и табличного обзора вы должны использовать NSFetchedResultsController. Это существенно извлекает данные из основных данных и организует их с помощью section и indexPath, поэтому его можно легко установить как источник данных tableView. Вот полная реализация потенциального UITableViewController, который соответствует 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.

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