2017-07-29 22 views
0

私はカスタムセルを持っていて、コアデータを使用しています。セルは更新されていません。 最初に私はいくつかのエンティティを作成しました。 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? 

} 

ご意見やご提案はありますか? ありがとうございました。

+0

あなたの問題は解決しましたか? –

+0

@Rameshいや、それは速いコンパイルエラーを与える、私は誰もが返信のおかげで、他の提案を見ることができるように上でそれを編集?コード生成オプションは、項目+ CoreDataProperties.swift このファイルとregenrateを削除して、同じ迅速なコンパイルエラー – LegalizePasta

+0

名を確認もappdeleagateで正確であるともう一度アプリを削除してインストールしてみてください –

答えて

0

コア・データ・ファイル内のクラスdefinationにエンティティと選択codegenのオプションを選択し、実行し、

0

私が削除を参照して、再度コアデータの生成されたファイルを作成し、私はまた、上の2つの関数のreturn文を変更MainVCがこれにゼロを戻すことはありません。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if let sections = controller.sections { 

     let sectionInfo = sections[section] 
     return sectionInfo.numberOfObjects 

    } else { 

    return 0 
    } 


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

    return 1 
} 
関連する問題