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

前端之家收集整理的这篇文章主要介绍了ios – 将核心数据检索到表视图单元格中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图简单地存储和检索CoreData(我以前用 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中,我想在动态单元格中检索数据:

class ItemListTableViewController: UITableViewController {

var items : Array<AnyObject> = []

override func viewDidLoad() {
    super.viewDidLoad()
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 1
}

override func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.
    return items.count
}


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

    let CellID: NSString = "cell"
    var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(CellID) as UITableViewCell
    var data: NSManagedObject = items[indexPath.row] as NSManagedObject


    var itemName = data.valueForKey("itemName") as String
    var price = data.valueForKey("price") as NSNumber
    var quantity = data.valueForKey("quantity") as NSNumber


    cell.textLabel!.text! = "\(itemName)"
    cell.detailTextLabel!.text! = "Price: \(price) - Quantity: \(quantity)"

    return cell

}

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

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

解决方法

使用核心数据和tableview时,应该使用NSFetchedResultsController.这本质上是从核心数据中检索数据,并通过section和indexPath进行组织,因此可以方便地将其设置为tableView的数据源.以下是符合NSFetchedResultsControllerDelegate的潜在UITableViewController的完整实现:
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.

猜你在找的iOS相关文章