2015-07-20 68 views
0

我在斯威夫特下列情況下奮力:斯威夫特 - 核心數據和NSCoding:無法調用指定的初始化

我有一個NSManaged類名爲事件:

import UIKit 
import Foundation 
import CoreData 

class Event: NSManagedObject, NSCoding { 

@NSManaged var eventArchived: Bool 
@NSManaged var eventCCRecipientAddress: String? 
@NSManaged var eventCCRecipientName: String? 
@NSManaged var eventEndDate: String? 
@NSManaged var eventEndRSVPDateTime: String? 
@NSManaged var eventHappeningId: String? 
@NSManaged var eventName: String? 
@NSManaged var eventResourcesFolderName: String? 
@NSManaged var eventStartDate: String? 
@NSManaged var eventId: String? 
@NSManaged var eventHappening: Happening 

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
} 

// MARK: NSCoding protocol conformance 
required init(coder aDecoder: NSCoder) { 

    let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext! 
    let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: context)! 

    // Note: pass `nil` to `insertIntoManagedObjectContext` 
    super.init(entity: entity, insertIntoManagedObjectContext: nil) 

    if let eventArchived = aDecoder.decodeObjectForKey("eventArchived") as? Bool { 
     self.eventArchived = eventArchived 
    } 
    if let eventCCRecipientAddress = aDecoder.decodeObjectForKey("eventCCRecipientAddress") as? String { 
     self.eventCCRecipientAddress = eventCCRecipientAddress 
    } 
    if let eventCCRecipientName = aDecoder.decodeObjectForKey("eventCCRecipientName") as? String { 
     self.eventCCRecipientName = eventCCRecipientName 
    } 
    if let eventEndDate = aDecoder.decodeObjectForKey("eventEndDate") as? String { 
     self.eventEndDate = eventEndDate 
    } 
    if let eventEndRSVPDateTime = aDecoder.decodeObjectForKey("eventEndRSVPDateTime") as? String { 
     self.eventEndRSVPDateTime = eventEndRSVPDateTime 
    } 
    if let eventHappeningId = aDecoder.decodeObjectForKey("eventHappeningId") as? String { 
     self.eventHappeningId = eventHappeningId 
    } 
    if let eventName = aDecoder.decodeObjectForKey("eventName") as? String { 
     self.eventName = eventName 
    } 
    if let eventResourcesFolderName = aDecoder.decodeObjectForKey("eventResourcesFolderName") as? String { 
     self.eventResourcesFolderName = eventResourcesFolderName 
    } 
    if let eventStartDate = aDecoder.decodeObjectForKey("eventStartDate") as? String { 
     self.eventStartDate = eventStartDate 
    } 
    if let eventId = aDecoder.decodeObjectForKey("eventId") as? String { 
     self.eventId = eventId 
    } 
} 

func encodeWithCoder(aCoder: NSCoder) { 

    aCoder.encodeObject(eventArchived, forKey: "eventArchived") 

    if let eventCCRecipientAddress = self.eventCCRecipientAddress { 
     aCoder.encodeObject(eventCCRecipientAddress, forKey: "eventCCRecipientAddress") 
    } 
    if let eventCCRecipientName = self.eventCCRecipientName { 
     aCoder.encodeObject(eventCCRecipientName, forKey: "eventCCRecipientName") 
    } 
    if let eventEndDate = self.eventEndDate { 
     aCoder.encodeObject(eventEndDate, forKey: "eventEndDate") 
    } 
    if let eventEndRSVPDateTime = self.eventEndRSVPDateTime { 
     aCoder.encodeObject(eventEndRSVPDateTime, forKey: "eventEndRSVPDateTime") 
    } 
    if let eventCCRecipientAddress = self.eventCCRecipientAddress { 
     aCoder.encodeObject(eventCCRecipientAddress, forKey: "eventCCRecipientAddress") 
    } 
    if let eventHappeningId = self.eventHappeningId { 
     aCoder.encodeObject(eventHappeningId, forKey: "eventHappeningId") 
    } 
    if let eventName = self.eventName { 
     aCoder.encodeObject(eventName, forKey: "eventName") 
    } 
    if let eventResourcesFolderName = self.eventResourcesFolderName { 
     aCoder.encodeObject(eventResourcesFolderName, forKey: "eventResourcesFolderName") 
    } 
    if let eventStartDate = self.eventStartDate { 
     aCoder.encodeObject(eventStartDate, forKey: "eventStartDate") 
    } 
    if let eventId = self.eventId { 
     aCoder.encodeObject(eventId, forKey: "eventId") 
    } 

    aCoder.encodeObject(eventHappening, forKey: "eventHappening") 
} 
} 

曾經是「類簡單「只有NSManaged變量,直到我被要求實現NSCoding協議。我使用NSCoding,因爲我需要知道我應用程序中任何地方的當前事件,包括離線模式。

當我嘗試使用我的事件類,我保持具有以下錯誤:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'AccueilInviteVIP.Event' 

這是我嘗試訪問我的課:

var currentEvent = Event() 

然後在viewDidLoad方法:

// currentEvent 
    currentEvent = NSEntityDescription.insertNewObjectForEntityForName("Event", inManagedObjectContext: self.managedObjectContext!) as! Event 

它在這條線上崩潰。

錯誤應該是非常清楚的,似乎我的init方法是不正確的,但我不能得到它的工作,因爲我是新來的Swift,並找不到任何接近這個例子。

任何幫助將是偉大的!

謝謝

雨果

回答

0

看起來過度設計和太多的代碼給我。

爲什麼不直接存儲eventId並從Core Data中檢索對象?也要歸檔它看起來非常混亂和多餘。

// store 
NSUserDefaults.standardUserDefaults().setObject(event.eventId forKey:"mainEventID") 

// retrieve 
let eventId = NSUserDefaults.standardUserDefaults().stringForKey("mainEventId")! 
let request = NSFetchRequest(entityName: "Event") 
request.predicate = NSPredicate(format: "eventId = %@", eventId) 
let event = (context.executeFetchRequest(request, error:nil) as [Event]).first! 

你將不得不做一些更多的錯誤和nil檢查,但你的想法。