Frage

Ich habe bereits einen Tag zu diesem Thema getötet und habe immer noch keine Ahnung, wie dies richtig gemacht werden könnte.

Ich benutze NSOutlineView zum Anzeigen von Dateisystemhierarchie. Für jede Zeile in der ersten Spalte muss ich das Kontrollkästchen, das zugeordnete Symbol und den Namen der Datei oder des Verzeichnisses anzeigen. Da es keinen Standard -Weg gibt, dies zu machen, habe ich unterklassifiziert NSTextFieldCell Verwenden Sie sowohl SourceView- als auch Photosearch -Beispiele, Bindung value in ib zu name Eigenschaft meiner Baumartikelklasse NSTreeController. Ich benutze drawWithFrame:inView: Überschreiben Sie das Kontrollkästchen und das Bild, um die Textzeichnung an die Weiterleitung von Text zu malen super. Ich benutze auch trackMouse:inRect:ofView:untilMouseUp: Überschreiben Sie die Kontrollkästchen -Interaktion über die Kontrollkästchen.

Alles war in Ordnung, bis ich bemerkte, dass das Zellobjekt kopiert wird copyWithZone: und dieses temporäre Objekt wird dann gesendet a trackMouse:inRect:ofView:untilMouseUp: Nachricht, die es unmöglich macht, den Überprüfungszustand der ursprünglichen Zelle in der Ansicht zu ändern.

Da es sich bei dem Frage -Thema um Bindungen handelt, dachte ich, dies könnte die Antwort sein, aber ich verstehe nicht, wie ich all das Durcheinander verbinden soll, um wie erwartet zu funktionieren. Versuchte das:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"selection.state"
                                       options:nil];

aber überhaupt nicht gelungen. Scheint, als würde ich es nicht bekommen.

Kann dies ein völlig falscher Weg sein, den ich genommen habe? Könnten Sie eine bessere Alternative oder Links zum weiteren Lesen vorschlagen?


Upd 21.01.11: Ich habe auch das versucht:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"arrangedObjects.state"
                                       options:nil];

Aber immer wieder Fehler wie [<_nscontrollerTreeproxy 0x ...> ValueForundEfinedKey:]: Diese Klasse ist nicht wichtiger Wertcodierungskodierung für den Schlüsselstatus." und ähnlich.

War es hilfreich?

Lösung 2

Okay, ich habe es geschafft, das zu tun, was ich brauchte, indem ich Spalten binden value zu arrangedObject's self (in IB) und übergeordnete Zellen überschreiben setObjectValue: so dass es so aussieht:

- (void) setObjectValue:(id)value
{
    if ([value isMemberOfClass:[MyNodeClass class]])
    {
        [super setObjectValue:[value name]];
        [self setIcon:[value icon]];
        [self setState:[value state]];
    }
    else
    {
        if (!value)
        {
            [self setIcon:nil];
            [self setState:NSOffState];
        }
        [super setObjectValue:value];
    }
}

Tatsächlich state Veränderung wird in einer anderen Klasse durchgeführt, wobei die Methode mit der Zelle verbindet selector (in ib), die ich mithilfe von

[NSApp sendAction:[self action] to:[self target] from:[self controlView]];

aus Zellen trackMouse:inRect:ofView:untilMouseUp:. Diese Methode der anderen Klasse sieht so aus:

- (IBAction) itemChecked:(id)sender
{
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject];
    if (node)
    {
        [node setState:[node state] == NSOnState ? NSOffState : NSOnState];
    }
}

Andere Tipps

Sie binden einen Wert der Tabelle (oder einen Umriss), nicht den Zustand einer einzelnen Datenzelle. Der Objektwert der Datenzelle wird auf den Wert der aktuellen Zeile/Col eingestellt und dann gezeichnet, sodass Sie möglicherweise keine potenziell Tausenden (oder Millionen?) Zellen ohne guten Grund erzeugt haben.

Darüber hinaus möchten Sie den Baum- oder Array -Controller arrangedObjects, nicht seine Auswahl.

Binden die Säulen Wert für die Baumsteuerung des Baumes arrangedObjects als Controllerschlüssel und "Status" als Modellschlüsselpfad in IB; oder @"arrangedObjects.state" in Code wie oben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top