leidiges Thema: NSTableView und die automatische Sortierung

  • leidiges Thema: NSTableView und die automatische Sortierung

    Hallo Leute,

    ich habe versucht, aus den schon vielen existierenden Beiträgen zu diesem Thema schlau zu werden und eine für mich passende Lösung zu finden. Aber nichts hat geholfen. Deshalb erläutere ich einfach mal, was ich bisher getan habe und was nicht so läuft, wie es sollte.

    Meine NSTableView hat nur eine NSTableColumn mit dem Identifier "name". Bei Sort Key habe ich auch "name" eingetragen, bei Sort Selector "compare:" und bei Sort Order "Ascending". Nun dachte ich, daß die Sortierung automatisch funktionieren sollte, wenn ich einmal auf die Spaltenüberschrift klicke. Die Pfeile erscheinen zumindest, aber die Daten werden nicht sortiert.

    Die sind eh auch etwas merkwürdig dargestellt. Starte ich meine Anwendung, so steht in der erste Zeile ziemlicher Krautsalat. Sieht so aus, als wenn mehrere Einträge übereinander geschrieben worden sind. Darunter ist dann alles normal und wenn ich das Fenster etwas vergrößere, so ordnet sich jeder Eintrag ein und der Salat ist weg.

    Die Daten kommen über DataSource von einer Controller-Klasse. Falls ihr da noch weitere Informationen zu meinem Vorgehen braucht, müßt ihr es einfach sagen. Mit Objective-C und Cocoa befasse ich mich noch nicht lang, weshalb speziell dieses Thema bisher nicht so günstig gelöst finde. Da sind mir Collections etc. in Java lieber :) Aber ich will ja nicht unken. Dafür sieht die Oberfläche halt gleich viel hübscher aus.

    Vielen Dank im Voraus.
    Marco
  • Hast du in deiner Data-Source -tableView:sortDescriptorsDidChange: implementiert?

    Das könnte z.B. so aussehen:

    Quellcode

    1. - (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray *)oldDescriptors
    2. {
    3. NSArray *newDescriptors = [tableView sortDescriptors];
    4. [myArray sortUsingDescriptors:newDescriptors];
    5. [tableView reloadData];
    6. }

    Ich würde dir allerdings empfehlen, mal einen Blick auf Cocoa Bindings zu werfen (gibt's allerlei Tutorials zu), da hast du das erheblich bequemer...
  • Ich hab keine Ahnung ob dir das für dein Thema hilft, aber da ich mich heute auch mit einer automatischen Sortierung in NSTableView herumgeschlagen habe, hier einfach mal mein Problem inklusive meiner Lösung (die vermutlich nicht 100% ideal ist).

    Ich habe eine Dokumentenbasierte Core Data Anwendung.
    In der NSTableView werden die Werte eines NSArrayControllers dargestellt, die Spalten sind jeweils an Modelkeys von arrangedObjects gebunden. (Denke es weiß trotz sprachlicher Ungenauigkeit jeder was ich da gemacht habe).

    Nun möchte ich die Tabelle beim öffnen automatisch nach einer gewissen Spalte sortiert haben. Das ist notwendig weil mir Core Data sonst die Objekte wild durcheinander in die Tabelle wirft. Die Spalte nach der ich sortieren möchte enthält NSDate als Wert, der keypath an den gebunden ist, ist arrangedObjects.date.

    Um meine Sortierung zu erzwingen, habe ich in einem Objekt in die awakeFromNib folgenden Code gepackt:

    Quellcode

    1. -(void) awakeFromNib {
    2. NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
    3. [table setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    4. }


    Ich gebe der Tabelle einen NSSortDescriptor mit dem Key für das Model, dann bekomme ich mein beabsichtigtes Verhalten. Warum das so ist weiß ich selbst nicht genau, die ganze Prozedur läuft bei mir eher in der Kategorie Hack-Juchu-es-klappt.

    Die verwendete Vergleichsmethode ist laut Apple doku compare:, man kann aber auch andere angeben soweit ich weiß.

    Hoffe das hilft jetzt ein wenig?!
    Gruß Julian
  • Ich kan auf den ersten Bick und wenn ich dich richtig verstanden habe, keinen Hack entdecken. So ist es geplant.

    Core Data wirft die auch nicht durcheinander. Vilmehr verhält es sich so, dass eine to-may-Relationship schlicht keine Ordnung hat. Deshalb wird sie ja auch von einem NSSet abgebildet.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Wie "omz" geschrieben hat, habe ich die Methode "sortDescriptorsDidChange" noch in der Controller-Klasse implementiert. Nun bekomme ich folgende Meldung im Run Log:

    Quellcode

    1. 2007-03-20 17:10:06.395 FontList[457] [<NSCFString 0x3322e0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.
    Was mich irgendwie auch wundert ist, daß selbst im Beispiel von Apple NSFontAttributeExplorer die Sortierung der NSTableView nicht funktioniert. Woran liegt das oder ist es da einfach nicht gewollt?

    Marco