2016-07-12 6 views
0

Ich mache eine einfache Notizen app und beim Starten der App gibt es mir den Fehler, "NSArray Element konnte Swift Array Element Type nicht übereinstimmen". Obwohl es wie dies viele andere Fragen sind, keiner von ihnen hatte das Problem in einem Tableviewcontroller, wenn die hierSwift 2.2 - NSArray Element konnte nicht Swift Array Element Typ für Zellen in einem TableViewController

cell.textLabel!.text = noteTitles[indexPath.row].title 

setzen ist mein vollständiger Code und die Klasse für das Array:

Code:

class TableViewController: UITableViewController { 
    var noteTitles:[Note] = [] 

    // MARK: - Table view data source 

    override func tableView(tableView: UITableView, 
          numberOfRowsInSection section: Int) -> Int { 
     return noteTitles.count 
    } 

    override func tableView(tableView: UITableView, 
     cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", 
      forIndexPath: indexPath) as UITableViewCell 

     cell.textLabel!.text = noteTitles[indexPath.row].title // Error here. 

     return cell 
    } 
} 

Und die Note Klasse:

class Note { 
    var title = "" 
    var content = "" 
} 

Bitte hel p mir und sag mir was ich falsch mache und hilf mir es zu reparieren. Vielen Dank im Voraus!

Hier Bild ab NSCoding Fehler gefragt:

code

hier Bild von KeyedUnarchiver Fehler:

code

+0

Können Sie fügen Sie die 'Note' Klassenimplementierung finden? – Mark

+0

@Mark Sorry, ich habe vergessen hinzuzufügen, nur hinzugefügt. –

+0

Wie laden Sie die Werte in das Array von 'Note's? Die Fehlermeldung besagt, dass das Array keine "Note" -Objekte enthält. – Paulw11

Antwort

0

Meine erste Vermutung ist, dass Sie die Note Klasse geändert, und Sie versuche die alte Klasse von NSUserDefaults zu laden. Was passiert, wenn Sie zuerst NSUserDefaults löschen? (Entweder durch den Schlüssel zu ändern Sie verwenden, oder das Hinzufügen in einem hart codiert removeObjectForKey().

+0

Ich habe den Schlüssel geändert, aber jetzt wird nicht gespeichert. Wie würde es jetzt sparen? Ich habe gerade ein "s" hinzugefügt, um den Schlüssel "Note" –

+0

Was meinst du, es wird nicht speichern? Vorausgesetzt, Sie haben den Schlüssel überall geändert (Sie sollten den Schlüssel wirklich in einer Konstante speichern), sollte er genauso wie zuvor gespeichert und geladen werden. – Mark

+0

Es ist schwierig zu sagen, was mit dem Speichern und Laden von 'NSUserDefaults' falsch ist. (Dieser Artikel könnte Ihnen helfen: http://shipster.com/nscoding/). Wenn Sie immer noch Probleme damit haben, öffnen Sie eine andere Frage speziell zu diesem Problem.Was die Konstante betrifft, meine ich, fügen Sie eine konstante Eigenschaft ('private let noteKey =" notes "') zu Ihrer Datei hinzu und verwenden Sie diese Konstante anstelle des String-Literals. Auf diese Weise müssen Sie den Schlüssel nur an einer Stelle ändern. – Mark

0

Array und Wörterbuch für NSUserDefaults müssen Eigenschaftsliste Elemente haben. So mit benutzerdefinierten Objekte für NSUserDefaults normalerweise unmöglich.

müssen Sie verwenden NSCoding und NSKeyed (Un) Archiver zu NSData von Array geändert

Wie ist das?

hier sehen Encoding and Decoding Objects

// just examples 
class Note: NSObject, NSCoding { 
    var note: String = "" 
// you must overriding init?(coder: NSCoder) and func encode(with: NSCoder) 
    // for unarchiving from NSData 
    required init?(coder aDecoder: NSCoder) { 
     super.init() 
     self.note = aDecoder.decodeObjectForKey("note")// just example 
    } 
    // for archiving to NSData 
    func encode(coder aCoder: NSCoder) { 
     aCoder.encodeObject(self.note, forKey: "note") 
    } 
} 

Titel Titel (Entschuldigung für Swift 3 Aussage. Sie können auch direkt Code mit Auto-Vervollständigung)

let notesArchived = NSKeyedArchiver.archivedData(withRootObject: notes), forKey: "notes") // is NSData 
// save notesArchived to NSUserDefaults 

get note Titel

let notesData = UserDefaults.standard.data(forKey: "notes")! // NSData 
let notes = NSKeyedUnarchiver.unarchiveObject(with: notesData) 

dies möglich mir

+0

Werden die Notentitel und die Notentitel in der Note-Klasse oder im ViewController angezeigt? –

+0

Ich denke, bequemer, dass in ViewController –

+0

Wenn ich die NSCoding der Klasse hinzufügen, gibt es mir einen Fehler, Typ 'Hinweis' bestätigt nicht Protokoll 'NSCoding'. Was mache ich? –

Verwandte Themen