1

アプリ内に単純なコアデータ機能を実装して、アプリが初めてロードされたときにのみチュートリアル (スクロールページを備えた別のビューコントローラー) を表示し、1 回おきにバイパスするようにしようとしています。Swift 2 の CoreData チュートリアルの構文から始めましたが、途中で見つけたエラー (SIGBRT など) を克服するのに役立つ Swift 3 の自動修正やその他のチュートリアルに基づいて微調整する必要がありました。私が抱えている現在の問題は EXC_BAD_INSTRUCTION エラーです。これを修正するのに助けが必要です。

次のコードを含む scrollViewController があります。

class ScrollViewController: UIViewController, NSFetchedResultsControllerDelegate {

@IBOutlet var mainScrollView: UIScrollView!

@IBOutlet weak var endTutorial: UIButton!

var imageArray = [UIImage]()

class Person: NSManagedObject {
    @NSManaged var tutorialstatus: String?
}

func seed() {
    let moc = DataController().managedObjectContext
    let entityDes = NSEntityDescription.entity(forEntityName: "Person", in: moc)
    let entity = Person(entity: entityDes!, insertInto: moc)
    entity.tutorialstatus="test value"
    do {
        try moc.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }
}

func fetch() {
    let moc = DataController().managedObjectContext
    let personFetch = NSFetchRequest<Person>(entityName: "Person")


    do {
        let fetchedPerson = try moc.fetch(personFetch)
        print(fetchedPerson.first!.tutorialstatus)

    } catch {
        fatalError("Failed to fetch person: \(error)")
    }
}

コンパイルしようとするlet fetchedPerson = try moc.fetch(personFetch)と、エラーEXC_BAD_INSTRUCTION (code=EXC_1386_INVOP, subcode=0x0)が表示されます。

Xcode 8、ベータ 8 を使用しています。「CoreDataStuf.xcdatamodeld」という名前の迅速なファイルがあり、「Person」という名前のエンティティと、文字列である「tutorialstatus」という属性があります。また、そのエンティティに Person のクラスを与えました。URL CoreDataStuf を参照する DataController.swift ファイルもあります。

4

3 に答える 3

2

このようなモックコンテキストで試してみてください

@IBOutlet weak var inValue: UITextField!
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
@IBAction func goBtn(_ sender: UIButton) {
    var inVal = Int(inValue.text!)!
    for i in inVal...inVal + 10 {
     context.perform {
         let nums = NSEntityDescription.insertNewObject(forEntityName: "Numbers", into: self.context) as! Numbers
            let request:NSFetchRequest<Numbers> = Numbers.fetchRequest()
            request.predicate = NSPredicate(format: "nums == %d", i)
            do { let numbers =  try? request.execute()
                if (numbers?.count)! > 0 {
                    print ("Value \(i) alreayd existis")
                } else {
                    nums.nums = Decimal(i) as NSDecimalNumber?
                }
              } catch let error {
                print ("Error while fetching \(error)")
            }
        }

        do {
            try self.context.save()
            print ("Value stored in DB \(i)")
        } catch let error {
            print ("Error while saving \(error)")
        }
    }
}
于 2016-09-18T20:16:34.147 に答える
2

これがうまくいきました:

let fetchedPerson = try moc.fetch(personFetch as! NSFetchRequest<NSFetchRequestResult>)
于 2016-09-09T16:13:49.320 に答える
1

試す:

    let personFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")
于 2017-06-14T09:13:05.213 に答える