2015-10-23 16 views
19

Swift kullanıcısıyım ve Çekirdek Verileri nasıl kullanacağımı öğrenmeye çalışıyorum. Ama bu hatayı alıyorum ve yanlış yaptığım şeyden emin değilim. İnternette araştırdım ve birkaç şey denedim ama doğru anlayamıyorum.Çözümleme 'NSManagedObject sınıfında atanan başlatıcı çağırılamadı'

Failed to call designated initializer on NSManagedObject class 'FirstCoreData.Course' 

bu hat yürütüldüğünde: Bu işlevde

ncvc.currentCourse = newCourse 

: Ders varlık için "... NSManagedObject alt sınıf oluşturma" tarafından üretilen

class TableViewController: UITableViewController, AddCourseViewControllerDelegate { 

var managedObjectContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "addCourse" { 
     let ncvc = segue.destinationViewController as! NewCourseViewController 
     ncvc.delegate = self 

     let newCourse = NSEntityDescription.insertNewObjectForEntityForName("Course", inManagedObjectContext: self.managedObjectContext) as! Course 
     ncvc.currentCourse = newCourse 

    } 
} 

Sınıf:

import Foundation 
import CoreData 

class Course: NSManagedObject { 

// Insert code here to add functionality to your managed object subclass 

} 

Ve:

import Foundation 
import CoreData 

extension Course { 

    @NSManaged var title: String? 
    @NSManaged var author: String? 
    @NSManaged var releaseDate: NSDate? 

} 

cevap

45

bakınız:

var currentCourse = Course() 

Bu sadece i tip Course olması currentCourse beyan etmiyor t ayrıca standart init yöntemini kullanarak Course öğesinin bir örneğini oluşturur. Bu açıkça izin verilmez: Belirtilen başlatıcıyı kullanmalısınız: init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?). Bu, Apple Documentation here'da açıklanmaktadır. bu isteğe olduğundan

var currentCourse : Course? 

, başlangıçta bir set gerekmez:

Seni hiç bu yüzden sadece tip Course? varlık olarak tanımlamak, yukarıdaki var tanım gereği oluşturulan örneği kullanmayın şüpheli değer, her ne zaman kullanılırsa değeri çözmeniz gerekecek.

+0

Teşekkürler @pdasdf benim için iyi çalışıyor. – Chetan

+0

Doğru tavsiye! Harika. –

0

Sizin currentCourse NSManagedObject sınıfı olmalıdır

sorun sorunuzu kod yatar, ama snippet'te diğer cevabı yorum olarak dahil bu CoreData: error: Failed to call designated initializer on NSManagedObject class

+0

: Ama ile tasarruf etmeyi unutmayın. Öyleyse varlık özniteliklerine nasıl erişeceğimi bilmiyorum. – Daniel

+0

Bence currentCourse da Kurs sınıfıdır, bu yüzden varlıkları kaybetmeyeceksiniz. – Vijay

+0

Üzgünüm anlamıyorum. Şu anda var currentCourse = Kur() var. Bunu var currentCourse = NSManagedObject() olarak değiştirirsem, o zaman Kurs üyelerine (örneğin, currentCourse.title) başvuran her şey "başlık, NSManagedObject öğesinin bir üyesi değil" der. – Daniel

7

Aynı sorunu yaşadım.

var currentCourse = Course.init(entity: NSEntityDescription.entityForName("Course", inManagedObjectContext:mox)!, insertIntoManagedObjectContext: mox) 

yerine:

var currentCourse = Course() 
2

Ben Swift 3.1 ile Xcode 8.3.2 bu kullanılan Ve bu çalıştı gibi nesnenin örneğini, sizin kurs için böyle bir şey olurdu. Aynı hata mesajını da aldım. Ancak bu veriler db'ye eklenmiştir. Yani belki bu önemli değil.

  • (parantez dışında) AppDelegate bağlam

geçirilerek değişken örneğini applicationDelegate bağlamda

  • için bir referans tanımlayın:

  • 3

    en basit yolu şudur: Kod:

    let currentCourse = Course(context:context) 
    

    Artık varlığınız oluşturuldu. Ben NSManagedObject olarak currentCourse bildirirseniz ben başlık, yazar ve ReleaseDate üyelerine erişim kaybedeceksiniz

    appDelegate.saveContext()