Bindings, "Sparse" Array [SOLVED]

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

  • Bindings, "Sparse" Array [SOLVED]

    Hey, ich hab nach langer Zeit jetzt endlich mal angefangen, Bindings wirklich zu benutzen. Hatte ich vorher nie so richtig benötigt, weils mir für meine Zwecke "explizit" auch immer lieber war.
    Nagut, erstmal funktioniert jetzt alles, wie es soll, aber ich habe jetzt gar keine Idee, was ich machen muss, um folgendes zu erreichen:

    Ich hab eine NSTableView. Die will ich mit dem Inhalt eines Arrays füllen. Das ist alles kein Problem, geht auch.
    Jetzt will ich aber, dass das Array kein NSArray ist. Es soll nichtmal ein Array sein, sondern sich nur so verhalten. Der Grund ist, dass ich gerne ein "sparse" Array mit 10000 Einträgen hätte, wobei aber immer nur die Elemente geladen/erzeugt werden sollen, die grade für das Anzeigen nötig sind.

    Die gewünschte Aufgabe anders Ausgedrückt:
    Ich möchte ein TableView, was 10000 Zeilen anzeigt, deren Inhalt jeweils eine Zahl 1-10000 ist, ohne dass ich ein Array mit 10000 Einträgen irgendwo habe.

    Ich steh jetzt dabei etwas auf dem Schlauch, mit der normalen dataSource delegate wäre das ja ein Kinderspiel, aber mit Bindings?
    NSArray subclassen klingt nicht so überzeugend.
    NSArrayController subclassen - überzeugt mich auch nicht?
    NSController der an eigene Instanz gebunden ist - ich bin zu blöd, jedenfalls bekommt die Instanz keine Nachrichten (ausserdem: welche soll sie bekommen?)
    Wie sonst?

    Also gebt mir mal bitte ein Tipp, bevor ich wieder ein TableViewDelegate implementiere und Bindings wieder weiter in die Zukunft schiebe :(
    C++

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

  • Na klasse, dafür mach ich mir die Mühe? Das muss doch gehen! So abwegig ist das ganze doch auch gar nicht, oder?
    EDIT (solved)
    Boah, war dann doch ganz einfach. NSArray subclass:

    Quellcode

    1. // header
    2. @interface QQMessageArray : NSArray {}
    3. @end
    4. // body
    5. @implementation QQMessageArray
    6. - (NSUInteger)count {
    7. NSLog(@"COUNT");
    8. return 20;
    9. }
    10. - (id)objectAtIndex:(NSUInteger)index {
    11. NSLog(@"objectAtIndex");
    12. return @"Foo!";
    13. }
    14. @end
    Alles anzeigen


    Dann gewohnt NSArrayController etc. und zack, eine Table mit 20 mal "Foo" drin. Wunderschön ;)

    Edit 2
    Sehr schön. 200.000 Zeilen sind auch kein Problem. Abgefahren! :D
    C++

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von zerm ()

  • Aaah! Vielen Dank! Genauso hatte ich das zwischenzeitlich gedacht, aber nicht hinbekommen. Hab nicht gerafft, wie ich die Methoden nennen muss, also welche er versucht zu verwenden, aber so ist es jetzt klar :)

    Aber schadet ja nichts, wenn ich jetzt bei meiner NSArray subclass bleibe, dann ist es schön gekapselt, und es ist klarer, welche Methoden gerufen werden. Oder spricht noch etwas dagegen?

    Ansonsten werde ichs in Zukunft aber so wie von Dir gezeigt machen :)
    C++
  • Markus Müller schrieb:

    Die KVC-Methode hat den Vorteil, dass automatisch die entspr KVO-Methoden getriggert werden und Du völlig unabhängig von einem Array bist. D.h. Dein Modell kann eine beliebige Collection sein, auf die sich über einen Index zugreifen lässt (z.b. eine STL-Collection).

    Ja schon. Ich will auch tatsächlich C++ Datenstrukturen zu Grunde legen. Aber wenn ich an denen etwas ändere, muss ich KVO eh selbst triggern, egal in welchem Fall?!
    C++
  • zerm schrieb:

    Markus Müller schrieb:

    Die KVC-Methode hat den Vorteil, dass automatisch die entspr KVO-Methoden getriggert werden und Du völlig unabhängig von einem Array bist. D.h. Dein Modell kann eine beliebige Collection sein, auf die sich über einen Index zugreifen lässt (z.b. eine STL-Collection).

    Ja schon. Ich will auch tatsächlich C++ Datenstrukturen zu Grunde legen. Aber wenn ich an denen etwas ändere, muss ich KVO eh selbst triggern, egal in welchem Fall?!

    Nein, KVC-Accessoren machen das selbst. Was du darin implementiert hast, spielt keine Rolle. Du kannst die einzelnen Einträge auch auf Blättern einer Toilettenpapierrolle notieren und per Flaschenpost verschicken.

    Du musst dir nicht einmal die Mühe machen, die KVC-Accessoren zu benutzen:

    Quellcode

    1. NSMutableArray* items = [entity mutableArrayValueForKey:@"items];
    2. [items addObject:@"Amin wr hier"];

    Alles KVC-compliant, alles KVO-compliant, alles Bindings-compliant.
    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"?