gpt4 book ai didi

ios - 快速将核心数据检索到 TableView 单元格中

转载 作者:IT王子 更新时间:2023-10-29 05:35:02 24 4
gpt4 key购买 nike

我正在尝试简单地存储和检索 CoreData(我之前使用 swift 成功完成的事情)。我得到的数据为 nil,但现在(不确定发生了什么变化)我没有收到错误,只是在 tableview 中没有显示任何内容。我不确定存储或检索对象是否有问题。我已经尽可能详细地了解了我在我的另一个应用程序中是如何做到的,但似乎有一些基本的东西我没有得到。这是我的。

我的模型:

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 的建议进行建模。但我仍然收到错误消息:不确定如何解决。 enter image description here

最佳答案

当使用核心数据和 TableView 时,您应该使用NSFetchedResultsController。这实质上是从核心数据中检索数据并按部分和索引路径组织它,因此可以轻松将其设置为 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 - 快速将核心数据检索到 TableView 单元格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com