2015-09-11 3 views
1

Я пытаюсь реализовать NSCoder, но в настоящее время я сталкиваюсь с упрямой проблемой. Моя цель - сохранить массив строк через NSCoder в локальном файле и загрузить его, когда приложение откроется в следующий раз.Кодирующий массив с NSCoder Swift

Вот класс я создал, но я не уверен, как я должен обрабатывать инициализации и кодировщик функции:

class MyObject: NSObject, NSCoding { 

var storyPoints: [String] = [] 

init(storyPoints : [String]) { 
    self.storePoints = storePoints 
} 


required init(coder decoder: NSCoder) { 
    super.init() 

??? 

} 

func encodeWithCoder(coder: NSCoder) { 
??? 
} 

}

Кроме того, как я к нему доступ в моей просмотреть контроллер? где я должен объявить путь для сохранения NSCoder? Это не совсем ясно.

С нетерпением жду любых советов.

спасибо.

+0

посмотрите на ссылку http://www.raywenderlich.com/12779/icloud-and-uidocument-beyond-the-basics-part-1, чтобы получить четкую картину о persisiting данные пользователя с помощью NSCoder и NSKeyedArcheiver –

ответ

2

Вот пример реализации и игровой площадки, которая сохраняет объект в каталоге/tmp. Функция init(coder:) переопределяет NSObject, поэтому required, и поскольку она не является назначенным инициализатором, она должна быть помечена как convenience. Также потому, что init(coder:) является инициализатором удобства, он не может позвонить super.init().

Чтобы ответить на ваш вопрос об архивировании массива, просто введите результат из decoderObjectForKey(_:). Проверьте документацию NSCoding на информацию и API для кодирования/декодирования. Там много чего.

import Cocoa 

class MyObject: NSObject, NSCoding { 

    var storyPoints: [String] = [] 

    init(storyPoints : [String]) { 
    self.storyPoints = storyPoints 
    } 

    convenience required init(coder decoder: NSCoder) { 
    let storyPoints = decoder.decodeObjectForKey("storypoints") as! [String] 
    self.init(storyPoints: storyPoints) 
    } 

    func encodeWithCoder(coder: NSCoder) { 
    coder.encodeObject(storyPoints, forKey: "storypoints") 
    } 
} 

enter image description here

+0

Спасибо! Работает хорошо, но каждый раз, когда я запускаю приложение, значения массива переназначаются, как будто никаких изменений не произошло. –

+0

Можете ли вы подтвердить, что вы вызываете метод archiveRootObject (_: toFile :) после внесения изменений в ваш объект? –

+0

Да, я делаю это в коде функции - сразу после obj.storyPoints.append (newObject). но когда я перезапущу - массив снова пуст. –

Смежные вопросы