2015-08-16 20 views
6

Ho una piccola app con alcune funzionalità di risparmio. Ho una classe modello di dati denominata: Closet:Salvataggio di array con 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() 
} 

} 

Quindi questo è il modello principale di dati di controllo, che nel primo View Controller, un utente è in grado di toccare il pulsante "+" per aggiungere un nome di reparto e il nome del manager. Il problema non è con il salvataggio di questo come io lo salvo con successo utilizzando NSKeyedArchive e lo carica indietro all'avvio dell'app.

Il problema:

voglio aggiungere una serie di assegnazioni su questo modello di dati Dipartimento chiamato Assegnazione che avrebbe un titolo e una note variabile. Questo è il modello di dati per l'assegnazione:

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() 
} 


} 

Quindi, quello che sto essenzialmente cercando di realizzare è un app in cui un utente inserisce diversi dipartimenti con nomi diversi Manager, che opera ora nella mia app, ma all'interno di un dipartimento, l'utente può fare clic sul pulsante "+" per aggiungere una sezione per il titolo e le note di assegnazione che può essere modificata quando si fa clic e che posso gestire successivamente. Questi incarichi sono diversi da un dipartimento all'altro.

Il mio grande problema è raggiungere questa funzionalità. Non riesco a farlo funzionare.

Desidero che questa proprietà di array asserisca parte della classe Department in modo che ogni cella possa avere il proprio elenco di cose da fare. qualsiasi aiuto mi aiuterebbe sicuramente molto. Grazie :)

+0

Qualsiasi aiuto con questo piccolo problema senza risultare nei dati principali? – Amit

risposta

9

Si sta utilizzando NSCoder correttamente, ma ci sono due errori in lettere maiuscole. Il primo errore riguarda la funzionalità dell'applicazione e il secondo errore è un errore stilistico. Hai codificato Task con la chiave "taskArray", ma hai provato a decodificarlo con la chiave "tasKArray". Se risolvi la K maiuscola in quest'ultima, il tuo codice funzionerà.

Il secondo errore di capitalizzazione è un errore stilistico: Task, come tutte le proprietà in Swift, deve essere scritto in lowerCamelCase (llamaCase).

Assicurarsi di prestare particolare attenzione ai rientri. Nella programmazione, seguiamo le regole speciali di indentazione che aiutano a rendere il codice chiaro. Ecco il codice corretto con corretto utilizzo delle maiuscole e minuscole:

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

Proverò a rifattorizzare il mio codice e vedere se funziona. Ma essenzialmente quello che sto cercando di ottenere, è salvare i dati all'interno dei dati. Le celle madri con celle figlio durante il taping di una cella genitore, mostrerebbero celle secondarie con la classe 'Assignment' come modello dati per contenere un 'titolo' e 'note' – Amit