私はカスタムセルを持っていて、コアデータを使用しています。セルは更新されていません。 最初に私はいくつかのエンティティを作成しました。 xcdatamodeIdにはManual/None Codegenオプションがあります。プロジェクトがビルドできないだろうと私は、このエラー与えるだろう:私は私のモデルのために生成されたクラスファイルに行って、すべての@objc(項目)行を削除した後CoreData情報が表のセルに表示されない
'An NSManagedObject of class 'DreamLister.Item' must have a valid NSEntityDescription.'
を、プロジェクトがでしたシミュレータのセルには何も現れません。カスタムセルはまた、私は、テストデータを生成していると私はこの
let ad = UIApplication.shared.delegate as! AppDelegate
let context = ad.persistentContainer.viewContext
編集のようAppDelegateにアクセスし、cellForRowAt関数のコードで使用される識別子があります。答えは変更することが示唆された後、クラス定義のコード生成オプションは、ビルドはスウィフトコンパイルエラーで失敗します。 コマンド:ここ
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1
は私のコントローラのコードである
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?
}
ご意見やご提案はありますか? ありがとうございました。
あなたの問題は解決しましたか? –
@Rameshいや、それは速いコンパイルエラーを与える、私は誰もが返信のおかげで、他の提案を見ることができるように上でそれを編集?コード生成オプションは、項目+ CoreDataProperties.swift このファイルとregenrateを削除して、同じ迅速なコンパイルエラー – LegalizePasta
名を確認もappdeleagateで正確であるともう一度アプリを削除してインストールしてみてください –