NSCollectionViewItem bekommt representedObject nicht übergeben (ist stets null beim Referenzieren)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSCollectionViewItem bekommt representedObject nicht übergeben (ist stets null beim Referenzieren)

    NSCollectionViewItem bekommt representedObject nicht übergeben

    Hallo Leute,

    ich stoße gerade auf etwas, auf das ich mir keinen Reim machen kann:

    Ich wollte man mit NSCollectionViews experimentieren. also habe ich diesbezüglich ein kleines Swift Projekt aufgesetzt.

    Mein Verständnis eines NSCollectionViews

    Ich habe mir die Doku bzgl NSCollectionView durchgelesen und es so verstanden, dass es über NSCollectionViewItems Daten repräsentiert. Die graphische Repräsentation erfolgt über NSViews, die dann an dem NSCollectionViewItem hängen. Das ist zumindest eine der dokumentierten Wege.

    Was habe ich vor?

    Ich möchte die Daten (Model) einiger Personen in einem NSCollectionView darstellen. Das Model ist bei mir ein Array von Dictionaries, welche jeweils Einträge für die Keys "Vorname", "Nachname" und "Strasse" beinhalten. Das Modell ist bei mir eine Klassenmember von AppDelegate.

    [/b]Was mache ich konkret?[/b]

    Ich platziere in daas MainWindow (Bei mit Teil des MainMenu.xib) eine NSCollectionView.

    Eine NSCollectionView braucht eine Instanz, welche das Interface NSCollectionViewDataSource implementiert.

    Also habe ich das (für den schnellen Test) einfach mal innerhalb meines AppDelegate gemacht. Also AppDelegate vom Interface NSCollectionViewDataSource abgeleitet und dafür die required Methoden func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int und collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem implementiert.

    In Ersterem gebe ich die Anzahl der CollectionViewItems zurück.

    In zweiter Methode erzeuge ich ein ein neues objekt vom Typ NSCollectionViewItem und gebe das zurück.

    Das Erzeugen der NSCollectionViewItems erledige ich über die Methode NSCollectionViewItem = collectionView.makeItem(withIdentifier:"ViewTemplate", for: indexPath)
    welches eine für die Represenatation des Items nötiges NSCollectionViewItem samt einem damit verbundenem NSView beinhaltet.

    Ich mache also in:

    C-Quellcode

    1. public func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem
    2. {
    3. let index = indexPath.item;
    4. /* The Identifier HAS TO be the name of the nib file that
    5. contains the View and the NSCollectionViewItem!
    6. This nib __HAS TO__ contain an NSCollectionViewItem among (to the Item linked) a
    7. NSView with its visual representation!
    8. */
    9. let item : NSCollectionViewItem = collectionView.makeItem(withIdentifier:"ViewTemplate", for: indexPath)
    10. item.representedObject = items[index].values;
    11. // ~~~~~~~~~~~~~~ Debug code start ~~~~~~~~~~~~~~~~~~~~~~~~~
    12. let s = String(format:"A: NSCollectionViewItem = %@", item.description)
    13. // Dump the item in order to check its content...
    14. Swift.print("\(s) : \(item)")
    15. // ~~~~~~~~~~~~~~ Debug code end ~~~~~~~~~~~~~~~~~~~~~~~~~
    16. return item
    17. }
    Alles anzeigen
    Dann habe ich noch von dem CollectionView die Datasource im IB auf AppDelegate (das ja dadurch, dass es NSCollectionViewDataSource implementiert) "verdrahtet".

    Wie oben erwähnt ist das Model items[index].values ein Dictionary (ist für den Test global in AppDelegate definiert), welches das Modell der Daten repräsentiert, welches dann der NSCollectionView in seinem Items repräsentieren soll... Auf die möchte ich dann im View des NSCollectionViewItems per KVC zugreifen.

    Soweit so gut! Wenn Ich das programm starte, dann gibt mir der print auch alles brav aus und ich sehe in meinem Fenster auch das NSCollectionView, mit auch brav so viel Items wie mein Model Elemente hat.

    ABER wenn ich dann im View, welcher das NSCollectionViewItem repräsentiert auf das representedObject zugreifen will, dann steht da immer nil drin obwohl ich representedObject gleich nach dem Kreieren meinem Modellelement zugewiesen habe...

    Beispielprojekt

    Was rede ich viel? Ich füge Euch am Besten mal mein Demoprojekt bei, welches das illustriert. In dem Code habe ich im View mal durch durch self.description die Repräsentation des NSDataCollectionViewItem ausgegeben. Da sieht man dann auch gut, dass representedObject nil ist.

    Hat Einer von Euch eine Erklärung hierfür?

    Vielen Dank im Voraus!

    VG aus München - Peter -
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von James ()