gpt4 book ai didi

ios - CoreData 信息未显示在表格单元格中

转载 作者:行者123 更新时间:2023-11-30 12:16:26 24 4
gpt4 key购买 nike

我有一个自定义单元格,并且使用核心数据,该单元格未更新。首先,我使用 Manual/None Codegen 选项在 .xcdatamodeId 处创建了一些实体。该项目无法构建,并且会给出以下错误:

“‘DreamLister.Item’类的 NSManagedObject 必须具有有效的 NSEntityDescription。”

在我为模型生成的类文件并删除所有 @objc(Item) 行后,项目已构建,但模拟器的单元格中不会出现任何内容。自定义单元格具有在 cellForRowAt 函数的代码中使用的标识符,我也在生成测试数据并像这样访问 AppDelegate

let ad = UIApplication.shared.delegate as! AppDelegate
let context = ad.persistentContainer.viewContext

编辑:在建议将 codegen 选项更改为类定义的答案之后,构建失败并出现 Swift 编译错误:命令:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc 失败,退出代码 1

这是我的 Controller 的代码

import UIKit
import CoreData

class MainVC: UIViewController, UITableViewDelegate, UITableViewDataSource, NSFetchedResultsControllerDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var segment: UISegmentedControl!

var controller: NSFetchedResultsController<Item>!


override func viewDidLoad() {
super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self

generateTestData()
attemptFetch()


}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) as! ItemCell

configureCell(cell: cell, indexPath: indexPath as NSIndexPath)

return cell

}

func configureCell(cell: ItemCell, indexPath: NSIndexPath) {

let item = controller.object(at: indexPath as IndexPath)
cell.configureCell(item: item)

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

if let objs = controller.fetchedObjects , objs.count > 0 {

let item = objs[indexPath.row]
performSegue(withIdentifier: "ItemDetailsVC", sender: item)
}
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ItemDetailsVC" {
if let destination = segue.destination as? ItemDetailsVC {
if let item = sender as? Item {
destination.itemToEdit = item
}
}
}

}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

if let sections = controller.sections {

let sectionInfo = sections[section]
return sectionInfo.numberOfObjects
}

return 0
}

func numberOfSections(in tableView: UITableView) -> Int {

return 0
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

return 150
}

func attemptFetch() {

let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
let dateSort = NSSortDescriptor(key: "created", ascending: false)

fetchRequest.sortDescriptors = [dateSort]

let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

controller.delegate = self

self.controller = controller

do {

try controller.performFetch()

} catch {

let error = error as NSError
print("\(error)")

}

}

func controllerWillChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.beginUpdates()
}

func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
tableView.endUpdates()
}

func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {

switch(type) {

case.insert:
if let indexPath = newIndexPath {
tableView.insertRows(at: [indexPath], with: .fade)
}
break
case.delete:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .fade)
}
break
case.update:
if let indexPath = indexPath {
let cell = tableView.cellForRow(at: indexPath) as! ItemCell
configureCell(cell: cell, indexPath: indexPath as NSIndexPath)
}
break
case.move:
if let indexPath = indexPath {
tableView.deleteRows(at: [indexPath], with: .fade)
}
if let indexPath = newIndexPath {
tableView.insertRows(at: [indexPath], with: .fade)
}
break

}
}


func generateTestData() {

let item = Item(context: context)
item.title = "MacBook Pro"
item.price = 1800
item.details = "I can't wait until the September event, I hope they release new MPBs"

let item2 = Item(context: context)
item2.title = "Bose Headphones"
item2.price = 300
item2.details = "But man, its so nice to be able to block out everyone with the noise canceling tech."

let item3 = Item(context: context)
item3.title = "Tesla Model S"
item3.price = 110000
item3.details = "Oh man this is a beautiful car. And one day, I willl own it"


ad.saveContext()


}


}

ItemCell 的代码

import UIKit

class ItemCell: UITableViewCell {

@IBOutlet weak var thumb: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var price: UILabel!
@IBOutlet weak var details: UILabel!

func configureCell(item: Item) {

self.title.text = item.title
self.price.text = "$\(item.price)"
self.details.text = item.details

}

}

以及核心数据生成文件的代码

项目+CoreDataClass.swift

import Foundation
import CoreData


public class Item: NSManagedObject {

public override func awakeFromInsert() {

super.awakeFromInsert()

self.created = NSDate()
}

}

项目+CoreDataProperties.swift

import Foundation
import CoreData

extension Item {

@nonobjc public class func fetchRequest() -> NSFetchRequest<Item> {
return NSFetchRequest<Item>(entityName: "Item");
}

@NSManaged public var created: NSDate?
@NSManaged public var details: String?
@NSManaged public var title: String?
@NSManaged public var price: Double
@NSManaged public var toImage: Image?
@NSManaged public var toItemType: ItemType?
@NSManaged public var toStore: Store?

}

有什么想法或想法吗?提前致谢。

最佳答案

在核心数据文件中选择实体并选择 Codegen 选项进行类定义并运行并查看

关于ios - CoreData 信息未显示在表格单元格中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45389117/

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