2015-08-16 12 views
6

Mam małą aplikację, która ma kilka funkcji oszczędzania. Mam klasy modelu danych o nazwie: Szafa:Zapisywanie tablicy z 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() 
} 

} 

Więc to jest główny model danych kontroler, który w pierwszym widoku kontrolera, użytkownik jest w stanie dotknąć przycisku „+”, aby dodać nazwa działu i nazwa menedżera. Problem nie polega na zapisaniu tego, ponieważ zapisuję go pomyślnie za pomocą NSKeyedArchive i ładuję go z powrotem po uruchomieniu aplikacji.

Problem:

chcę dodać szereg zadań na tym modelu danych Departamentu nazywa Przypisanie które mają zmienne tytuł i notatki. Jest to model danych dla przypisania:

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


} 

Więc co mam zasadniczo stara się osiągnąć to aplikacja, gdzie użytkownik wprowadza różne działy z różnymi nazwami, które praca menedżera teraz w mojej aplikacji, ale w dziale, użytkownik może kliknąć przycisk "+", aby dodać tytuł przydziału i sekcję notatek, którą można edytować po kliknięciu, którą mogę obsłużyć później. Te zadania różnią się w zależności od działu.

Moim dużym problemem jest osiągnięcie tej funkcjonalności. Nie wydaje mi się, żeby to działało.

Chcę, aby ta właściwość przydziału tablicy była częścią klasy Wydziału, aby każda komórka mogła mieć własny rodzaj listy zadań do wykonania. każda pomoc na pewno by mi bardzo pomogła. Dzięki :)

+0

Każda pomoc w tym małym problemie bez danych podstawowych? – Amit

Odpowiedz

9

Używasz poprawnie NSCoder, ale są dwa błędy w pisaniu wielkimi literami. Pierwszy błąd wpływa na funkcjonalność aplikacji, a drugi błąd jest błędem stylistycznym. Kodowałeś Task za pomocą klucza "taskArray", ale próbowałeś go rozszyfrować kluczem "tasKArray". Jeśli poprawisz kapitał K w drugim, twój kod będzie działał.

Drugi błąd kapitalizacji jest błędem stylistycznym: Task, podobnie jak wszystkie właściwości w Swift, należy zapisać w lowerCamelCase (llamaCase).

Pamiętaj, aby zwracać szczególną uwagę na wcięcia. W programowaniu istnieją specjalne reguły wcięć, które stosujemy, aby uczynić kod zrozumiały. Oto poprawiony kod z poprawną pisownością i wcięciem:

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

Spróbuję zmienić kod i sprawdzić, czy działa. Ale zasadniczo to, co próbuję osiągnąć, to zapisywanie danych w obrębie danych. Komórki macierzyste z komórkami potomnymi podczas nagrywania komórki macierzystej pokazywałyby komórki podrzędne z klasą "Przyporządkowanie" jako jej model danych do przechowywania "tytułu" i "uwag" – Amit

Powiązane problemy