Frage

Ich habe ein kleines NSTableView mit einer Checkbox. Jedes Mal, wenn das Kontrollkästchen nicht aktiviert ist, möchte ich eine der benachbarten NSCells abgeblendet und unzugänglich werden.

Aber ich kann nicht herausfinden, wie man nur eine bestimmte Zelle zu adressieren. -dataCellForRow von NSTableColumn immer ändert die Vorlage Zelle für die ganze Tabellenspalte.

Wie kann ich auf eine einzelne Zelle?

Edit:. ich die Tabellenansicht füllen Sie das NSTableViewDataSource Protokoll mit

War es hilfreich?

Lösung

Sie haben keine „um eine Zelle zugreifen“. NSTableView fragt nach Daten nur bei Bedarf, Sie füllen Sie es nicht oder sie direkt steuern.

Stattdessen erstellen Sie ein Controller-Objekt, das die NSTableViewDatasource implementiert und optional NSTableViewDelegate Protokolle. Die Tabellenansicht sendet dann die Datenquelle-Nachrichten an Ihre Controller und dem Controller liefert die entsprechenden Daten.

Sie können erlauben die Bearbeitung für ein Objekt in der Tabellenansicht angezeigt durch die ‑tableView:setObjectValue:forTableColumn:row: Datenquelle Verfahrens. Diese Methode wird auf dem Controller-Objekt aufgerufen werden, wenn der Benutzer das Kontrollkästchen klickt. Es ist die Verantwortung des Controllers ist das Modell entsprechend zu aktualisieren.

Wenn das Modell aktualisiert wird, den Controller sollte die Tabellenansicht neu zu laden erzählen. Die Tabellenansicht wird dann fragen Sie Ihren Controller für den Wert einer Zelle, die Anzeige unter Verwendung der ‑tableView:objectValueForTableColumn:row: Datenquelle Methode erfordert. Dazu gehören die Zelle, die Sie deaktivieren müssen. Ihr Controller Bedarf den entsprechenden Wert für die Zelle liefern.

Wenn Sie mehr Kontrolle der Zelle benötigen, können Sie das Gerät ‑tableView:willDisplayCell:forTableColumn:row: Delegatmethode. Dies nennt man kurz vor einer Zelle angezeigt wird, und Sie können die Zelle entsprechend ändern.

Weitere Informationen über Datenquellen sind in die Dokumentation .

Die andere Option (statt eine Datenquelle zu verwenden) ist Cocoa Bindungen und eine NSArrayController, die Sie verwenden binden, um Ihre Sammlung von Modellobjekten. In diesem Fall können Sie die Enabled Bindung der Tabellenspalte zu einer Eigenschaft des Modells Objekt binden, dass die Kontrollen der Zelle aktivierten Zustand. Es liegt in Ihrer Verantwortung sicherzustellen, dass der Zustand dieser Eigenschaft korrekt ist.

Wenn Sie die Eigenschaft abhängig von dem Wert einer anderen Eigenschaft zu machen, können Sie den abhängigen Schlüsselmechanismus in der Schlüsselwert Observing Dokumentation.

Andere Tipps

Könnten Sie binden die Editierbarkeit dieser Spalte auf den Wert, der in der Checkbox angezeigt wird? das heißt, wenn es aktiviert ist, es ist editierbar, sonst ist es nicht der Fall ist?

Ich versuche, die genaue Editor-Schnittstelle zu erinnern, und ich bin nicht neben meinem Mac zu Hause, so dass ich nicht in der Lage bin insgesamt Spaziergang durch auf, es zu tun -. Hoffen, dass diese Sie in der richtigen Richtung zeigen können

Seit SDK Version 10.7 gibt es -viewAtColumn:row:makeIfNecessary: auf NSTableView. Die Mehrheit der Informationen, die ich im Internet gefunden nicht die neuen Methoden berücksichtigen, so ist es hier für alle anderen für eine Antwort auf diese Frage suchen.

Von der Maus Ereignisse to Cell Selection

Fügen Sie zunächst ein Protokoll für Ihren Controller Griff Zellenauswahl aus einer Tabellenansicht, wie folgt aus:

@protocol XYZCellSelectionDelegate <NSObject>
- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column;
@end

Dann Unterklasse NSTableView und Überschreibung -mouseDown:

// In your Custom Table View subclass:
- (void)mouseDown:(NSEvent *)event
{
    NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];
    NSInteger selectedRowIndex = [self rowAtPoint:point];
    NSInteger selectedColumnIndex = [self columnAtPoint:point];

    if ([self.calendarViewDelegate respondsToSelector:@selector(cellViewWasSelectedAtRow:column:)])
    {
        [self.calendarViewDelegate cellViewWasSelectedAtRow:selectedRowIndex column:selectedColumnIndex];
    }

    [super mouseDown:event];
}

Danach können Sie -viewAtColumn:row:makeIfNecessary: wie dies in den Delegaten / Controller-Objekt verwenden:

- (void)cellViewWasSelectedAtRow:(NSInteger)row column:(NSInteger)column
{
    NSView *selectedView = [self.tableView viewAtColumn:column row:row makeIfNecessary:YES];

    // Do something with the cell to the right
    NSInteger nextColumn = column + 1;
    NSView *cellNextToIt = [self.calendarTableView viewAtColumn:nextColumn row:row makeIfNecessary:YES];

}

. Hinweis: Heute würde ich den Tisch Blick auf den Delegaten als Parameter übergeben, anstatt auf den Delegierten zu verlassen, einen Verweis auf die Tabellenansicht zu halten

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