Core Data outline View

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

  • Core Data outline View

    Hallo zusammen,

    versuch gerade das Thema NSOutlineView mit Swift 3 für macOS umzusetzen.
    Habe dafür ein YouTube Tutorial gefunden, welches mir folgende Ergebnis bringt:


    Bildschirmfoto 2017-05-05 um 13.09.06.png



    Quellcode: ViewController.swift

    1. import Cocoa
    2. class ViewController: NSViewController, NSOutlineViewDataSource, NSOutlineViewDelegate {
    3. @IBOutlet var treeController: NSTreeController!
    4. @IBOutlet weak var outlineView: NSOutlineView!
    5. override func viewDidLoad() {
    6. super.viewDidLoad()
    7. addData()
    8. }
    9. func addData() {
    10. let root: [String : Any] = [ "name": "Max Mustermann", "isLeaf": false ]
    11. let dict: NSMutableDictionary = NSMutableDictionary(dictionary: root)
    12. dict.setObject([Playlist()], forKey: "children" as NSCopying)
    13. treeController.addObject(dict)
    14. }
    15. func isHeader(item: AnyObject) -> Bool {
    16. if let item = item as? NSTreeNode {
    17. return !(item.representedObject is Playlist)
    18. } else {
    19. return !(item is Playlist)
    20. }
    21. }
    22. func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
    23. if isHeader(item: item as AnyObject) {
    24. return outlineView.make(withIdentifier: "HeaderCell", owner: self)
    25. } else {
    26. return outlineView.make(withIdentifier: "DataCell", owner: self)
    27. }
    28. }
    29. }
    Alles anzeigen

    Quellcode: Playlist.swift

    1. import Cocoa
    2. class Playlist: NSObject {
    3. dynamic var name: String = "New Playlist"
    4. func isLeaf() -> Bool {
    5. return true
    6. }
    7. }
    Alles anzeigen



    Soweit so gut - versuche auch aktuell zu verstehen, was wie und warum -> in Bezug auf den Code.
    allerdings stelle ich mir hier die Frage: wie kann das outline view mit Daten aus Core Data füllen?
    in dem Beispiel werden ja feste Werte mit einem dict gelöst.
  • würde gerne noch mal etwas detaillierter beginnen :)

    Mein Ist-Zustand:
    • ich habe zwei Entities: Person und Books
    • Ich kann Personen anlegen
    • Ich kann ein Buch anlegen, welches einer Person zuordnet ist (Relation)
    • und ich weiß, wie ich mir als "print" anzeigen lassen kann, welche person welches Buch beseitzt
    Das print-Ergebnis:

    Quellcode

    1. Person:Thomas
    2. Title:My Book 5
    3. Title:My Book 4
    4. ==========
    5. Person:Max
    6. Title:My Book 3
    7. Title:My Book 2
    8. Title:My Book 1
    9. ==========
    jetzt kommt der schwierige und für mich aktuell kompliziertes Teil, mit dem ich mich seit Tagen beschäftige aber nichts sinnvolles auf die Beine bekomme:
    Ich möchte dieses print-Ergebnis jetzt schön in einem NSOutlineView darstellen.Die "Root" Elemente sollen jeweils die Personen sein (Thomas und Max) - beide sollen aufklappbar sein und die jeweiligen zugehörigen Bücher als "Children" anzeigen.Problem ist und bleibt: ich komme wissenstechnisch mit den outlineviews nicht klar.Ich habe mein jetziges Xcode Projekt mal angehangen (Google Drive): https://drive.google.com/open?id=0B8PBtMQt9GdOUmRzZzRLZThzalWäre jemand so nett und hilfsbereit und könnte mir an meinem Beispiel ein OutlineView erstellen, sodass ich mir die Lösung anschauen und davon lernen kann.
    Damit wäre mir sehr geholfen. Bedanke mich schon mal herzlichst im voraus :)
  • Guten Morgen MCDan,

    ja die Tutorials habe ich soweit alle bereits gelesen und auch erfolgreich umsetzen können.
    Allerdings fehlt mir der Sprung von dort rüber in das Thema "Wie fühle ich NSOutlineView mit Daten aus Core Data"
    Denn raywenderlich.com arbeitet mir einer Datei

    und da hänge ich jetzt schon seit Tagen fest ;(
  • Habe es soweit geschafft, dass zumindest die Personen aus Core Data kommen und als Root Element im NSOutlineView angezeigt werden:
    Bildschirmfoto 2017-05-11 um 13.36.29.png

    Aufklappen lassen sich diese auch, allerdings gibt es hier nur einen statischen String, der ausgeben wir.
    Habe jetzt immer noch eine Mischung aus Core Data und einen Teil aus einem Tutorial welcher mit festen Werten arbeitet.
    Bekomme also die Subelemente nicht aus Core Data gefüllt.

    Habe das Projekt in aktualisierte Form angehangen.
    Hoffe Ihr könnt helfen :)


    drive.google.com/open?id=0B8PBtMQt9GdOeVY0M2pHX2psbVk

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

  • Versuche es mal damit. Ich habe den kompletten TreeController und die Bindings entfernt und fülle alles über die DataSource Methoden.

    Zum Ray Wenderlich Tutorial: Es ist prinzipiell völlig egal ob die Daten aus einer plist kommen oder aus CoreData oder von einem Webservice oder oder oder. Halte dich einfach an die Schritte im Tutorial, dann sollte es klappen. Evtl. musst du der OutlineView sagen, dass sie die Daten neu laden soll nachdem sie z.B. von einem Webservice geladen wurden.

    Ganz schlecht ist es, wenn du verschiedene Ansätze mischst, wie hier Bindings und der Weg über die DataSource Methoden.
    Dateien
    • CoreDataRS 2.zip

      (70,08 kB, 332 mal heruntergeladen, zuletzt: )
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • Klasse !
    vielen vielen Dank.

    Darf ich fragen warum du es nicht über den TreeController gelöst hast ?
    Hat dies einen sinnvollen Grund?

    Und darf ich fragen was das > 0 für eine Bedeutung hat:

    Quellcode

    1. return person.books.count > 0

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

  • PetTus schrieb:

    Darf ich fragen warum du es nicht über den TreeController gelöst hast ?
    Gewohnheit, ich habe es einfach so gemacht wie ich es auch in dem Tutorial beschrieben habe. Mit Bindings kenne ich mich nicht besonders gut aus, daher finde ich den Weg über das DataSource Protokoll leichter. Dann ist der TreeController aber auch unnötig.


    PetTus schrieb:

    Und darf ich fragen was das > 0 für eine Bedeutung hat:
    Die Methode soll ein Bool zurück geben, was diese Zeile macht. Ist im Grunde eine Abkürzung für:

    C-Quellcode

    1. if person.books.count > 0 {
    2. return true
    3. } else {
    4. return false
    5. }
    Das Herz besitzt Gründe, die die Vernunft nicht kennt.
  • pierredrks schrieb:

    Die Methode soll ein Bool zurück geben, was diese Zeile macht. Ist im Grunde eine Abkürzung für:

    C-Quellcode

    1. if person.books.count > 0 {
    2. return true
    3. } else {
    4. return false
    5. }
    Das ist keine Abkürzung, sondern die If-Anweisung ist eine Verkomplizierung eines einfachen booleschen Ausdrucks. Dank ternärem Operator lässt sich das beliebig weitertreiben:

    Quellcode

    1. if (person.books.count > 0 ? true : false) ? true : false {
    2. return true
    3. }
    4. else {
    5. return false
    6. }
    „Meine Komplikation hatte eine Komplikation.“