У меня есть проблема, о которой я не могу придумать. У меня есть класс, определенный ниже.NSCoding неожиданно находит nil
В делегате приложения я звоню EyeGamesPrefs.loadData()
, и он падает на watchList = aDecoder.decodeObjectForKey("watchList") as! [Int]
, говоря, что он столкнулся с нолем.
Если я достаньте
watchList
переменную, которая идентична переменнойselectedConsoleIndeces
, она отлично работает.Если я изменю его на
watchList = aDecoder.decodeObjectForKey("selectedConsoleIndeces") as! [Int]
, он отлично работает.Если я копирую и вставляю тот же самый код в пустой проект, он отлично работает.
Он работает в текущем проекте на симуляторе iPhone 5, но не на симуляторе iPhone 6. В новом проекте он работает на 6.
Может кто-нибудь объяснить, почему watchList
не будет работать, но selectedConsoleIndeces
делает? Единственное отличие - это имя переменной! И почему это будет работать в другом проекте, но не в этом? Это просто не имеет никакого смысла.
class EyeGamesPrefs:NSObject,NSCoding {
// This is a shared instance available throughout the app
static var sharedInstance = EyeGamesPrefs()
// These are various preferences used thoughout the app
// They are saved and loaded from NSUserDefaults.standardUserDefaults() when the app launches or goes into the background
// See the App Delegate
var colorScheme: Int // index of color scheme in listOfColorSchemes
var boughtRemoveAds: Bool
var boughtSkins: Bool
var watchedTutorial: Bool
var selectedConsoleIndeces: [Int]
var watchList: [Int]
override init() {
colorScheme = 0
boughtRemoveAds = false
boughtSkins = false
watchedTutorial = false
selectedConsoleIndeces = Array(0...(50 - 1))
watchList = Array(0...(50 - 1))
super.init()
}
// What to do when this object is saved to NSUserDefaults
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(colorScheme, forKey: "colorScheme")
aCoder.encodeObject(boughtRemoveAds, forKey: "boughtRemoveAds")
aCoder.encodeObject(boughtSkins, forKey: "boughtSkins")
aCoder.encodeObject(watchedTutorial, forKey: "watchedTutorial")
aCoder.encodeObject(selectedConsoleIndeces, forKey: "selectedConsoles")
aCoder.encodeObject(watchList, forKey: "watchList")
}
// What to do when this object is loaded from NSUserDefaults
required init(coder aDecoder: NSCoder) {
colorScheme = aDecoder.decodeObjectForKey("colorScheme") as! Int
boughtRemoveAds = aDecoder.decodeObjectForKey("boughtRemoveAds") as! Bool
boughtSkins = aDecoder.decodeObjectForKey("boughtSkins") as! Bool
watchedTutorial = aDecoder.decodeObjectForKey("watchedTutorial") as! Bool
selectedConsoleIndeces = aDecoder.decodeObjectForKey("selectedConsoles") as! [Int]
watchList = aDecoder.decodeObjectForKey("watchList") as! [Int]
}
class func savePreferences() {
let data = NSKeyedArchiver.archivedDataWithRootObject(EyeGamesPrefs.sharedInstance)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: "preferences")
NSLog("saved preferences")
}
class func loadPreferences() {
if let data = NSUserDefaults.standardUserDefaults().objectForKey("preferences") as? NSData {
let prefs = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! EyeGamesPrefs
EyeGamesPrefs.sharedInstance = prefs
NSLog("loaded preferences")
}
}
Спасибо за ваш ответ. Значение, которое записывается в NSUserDefaults, фактически является объектом sharedInstance как сериализованные данные (см. Функцию savePreferences). Если этого не было, ключевой unarchiver никогда не будет называться, поэтому я уверен, что он есть. Я проверил его, используя ваш отзыв. Проблема должна быть в процессе разборки. – Erik