2015-08-16 2 views
6

У меня есть небольшое приложение, которое имеет несколько функций сохранения. У меня есть класс модели данных называется: гардероб:Сохранение массива с помощью NSCoding

class Department: NSObject, NSCoding { 
    var deptName = "" 
    var managerName = "" 

    var Task: [Assignment]? // <----- assignment class is in example 2 

    func encodeWithCoder(aCoder: NSCoder) { 

    aCoder.encodeObject(deptName, forKey: "deptName") 
    aCoder.encodeObject(managerName, forKey: "mngName") 
    // aCoder.encodeObject(Task, forKey: "taskArray") 

} 

    required init(coder aDecoder: NSCoder) { 

    super.init() 

    course = aDecoder.decodeObjectForKey("deptName") as! String 
    instructor = aDecoder.decodeObjectForKey("mngName") as! String 
    // Task = aDecoder.decodeObjectForKey("tasKArray") as? [Assignment] 

} 

override init() { 
    super.init() 
} 

} 

Так это основная модель данных контроллер, который в первом View Controller, пользователь может нажать на кнопку «+», чтобы добавить имя отдела и имя менеджера. Проблема заключается не в том, чтобы сохранить это, так как я успешно сохраняю его с помощью NSKeyedArchive и загружает его при запуске приложения.

Проблема:

Я хочу, чтобы добавить массив заданий на этой модели данных отдела называется Назначение который будет иметь название и примечания переменной. Это модель данных для задания:

Assignment.swift

class Assignment: NSObject, NSCoding { 
    var title = "" 
    var notes = "" 

     func encodeWithCoder(aCoder: NSCoder) { 

    // Methods 
    aCoder.encodeObject(title, forKey: "Title") 
    aCoder.encodeObject(notes, forKey: "notepad") 

} 

required init(coder aDecoder: NSCoder) { 


// Methods 
    title = aDecoder.decodeObjectForKey("Title") as! String 
    notes = aDecoder.decodeObjectForKey("notepad") as! String 

    super.init() 
} 

override init() { 
    super.init() 
} 


} 

Так что я по существу пытаюсь достичь этого приложение, где пользователь вводит различные отделы с разными именами менеджеров, которые работают теперь в моем приложении, но внутри отдела, пользователь может нажать кнопку «+», чтобы добавить заголовок назначения и раздел примечаний, которые можно редактировать при нажатии, которые я могу обработать впоследствии. Эти задания отличаются от отделов к отделу.

Моя большая проблема заключается в достижении этой функциональности. Кажется, я не работаю.

Я хочу, чтобы это свойство присваивания массива было частью класса отдела, поэтому каждая ячейка может иметь свой собственный список дел. любая помощь определенно поможет мне многое. Спасибо :)

+0

Любая помощь с этой небольшой проблемой без получения данных Core Data? – Amit

ответ

9

Вы используете NSCoder правильно, но есть две ошибки в капитализации. Первая ошибка влияет на функциональность приложения, а вторая ошибка - стилистическая ошибка. Вы закодировали Task с ключом "taskArray", но вы попытались его декодировать с помощью ключа "tasKArray". Если вы исправите капитал K в последнем, то ваш код будет работать.

Ошибка второй заглавной буквы - стилистическая ошибка: Task, как и все свойства в Swift, должны быть записаны в lowerCamelCase (llamaCase).

Обязательно обратите внимание на отступы. В программировании действуют специальные правила отступов, которые помогают сделать код понятным. Вот скорректированный код с надлежащей капитализацией и отступом:

class Department: NSObject, NSCoding { 
    var deptName = "" 
    var managerName = "" 

    var task: [Assignment]? 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(deptName, forKey: "deptName") 
     aCoder.encodeObject(managerName, forKey: "mngName") 
     aCoder.encodeObject(task, forKey: "taskArray") 
    } 

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

     course = aDecoder.decodeObjectForKey("deptName") as! String 
     instructor = aDecoder.decodeObjectForKey("mngName") as! String 
     task = aDecoder.decodeObjectForKey("taskArray") as? [Assignment] 
    } 

    override init() { 
     super.init() 
    } 
} 

class Assignment: NSObject, NSCoding { 
    var title = "" 
    var notes = "" 

    func encodeWithCoder(aCoder: NSCoder) { 
     // Methods 
     aCoder.encodeObject(title, forKey: "Title") 
     aCoder.encodeObject(notes, forKey: "notepad") 
    } 

    required init(coder aDecoder: NSCoder) { 
     // Methods 
     title = aDecoder.decodeObjectForKey("Title") as! String 
     notes = aDecoder.decodeObjectForKey("notepad") as! String 

     super.init() 
    } 

    override init() { 
     super.init() 
    } 
} 
+0

Я попытаюсь реорганизовать свой код и посмотреть, работает ли он. Но в основном то, что я пытаюсь достичь, - это сохранение данных в данных. Родительские ячейки с дочерними ячейками при нажатии на родительскую ячейку будут отображать дочерние ячейки с классом «Назначение» в качестве модели данных для хранения «заголовка» и «заметок», – Amit

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