2013-02-02 6 views
6

Ich versuche, eine einfache NSTableView (nur Text) zu machen, wo die Zellenansichten angeklickt werden können, um den Text zu bearbeiten. Alle Tutorials und verwandten Fragen deuten darauf hin, dass dies das automatische Verhalten ist, aber ich verstehe es nicht.NSTableView kann nicht mit Klick bearbeitet werden

Ich habe keine Probleme, meine Delegierten und Datenquellen zu verknüpfen; Ich kann alle Zellen programmatisch auffüllen, und ich kann herausfinden, was mit dem neuen Text geschehen soll, der beim Bearbeiten eingegeben wird. ... Ich kann das Textfeld nicht zum Bearbeiten öffnen!

nach Hinweisen

Dank (Die NSTable Spalten werden als editierbare in IB markiert).

+0

OK, keine Antworten, aber kann jemand bestätigen, dass zumindest das möglich sein _should_, klicken/eine Zelle in einem Doubleclick NSTableView, das das Textfeld zur Bearbeitung öffnet? Ich beginne mich zu fragen, ob meine Xcode-Installation kaputt ist. In jedem Tutorial, das ich finden kann, wird dies als normales Verhalten ohne Erklärung verstanden, wie es erstellt wird. Vielen Dank. –

+1

Es stellt sich heraus, dass es kein Standardverhalten ist und global in IB nicht einstellbar ist. Sie müssen jede zu bearbeitende Zelle manuell codieren, wenn Sie sie in Ihrer Datenquelle/Ihrem Delegaten erstellen. –

+0

Ich habe die gleiche Frage. Wenn Sie in einer offiziellen Antwort mehr Details angeben können, wäre das großartig. – Brett

Antwort

6

In der TableView: viewForTableColumn-Delegate-Methode musste ich jede Zelle speziell festlegen, um bearbeitbar zu sein.

Es scheint ohne Probleme nach ein paar Wochen zu arbeiten, aber ich denke immer noch, dass es eine weniger mühsame Methode irgendwie sein muss.

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { 


    NSTableCellView *cellView; 
    if([tableColumn.identifier isEqualToString:@"word"]) 
    { 
     wordCellView = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; 
     cellView = wordCellView; 
     [cellView.textField setEditable:YES]; // Make Cell Editable! 
    } 
} 
+0

Die Einstellung editierbar war der Schlüssel für mich! Vielen Dank! – Brett

+2

Sie müssen 'cellView' am Ende rechts zurückgeben? – Arc676

+0

Großartige Idee, aber in der Tat ist es nicht notwendig; siehe http://stackoverflow.com/a/28282459/341994. – matt

7

Sie können dies im Interface Builder tun, indem Sie das Textfeld Zelle markieren, dann die Attribute Inspector verwenden, blättern Sie zu dem Dropdown-Menü unten dem Titel „Verhalten“ und wählen Sie „Editierbare“.

Dies allein ermöglicht es Ihnen, auf einzelne Zellen doppelklicken zu können und sie zu einem bearbeitbaren TextField zu machen.

Um die Änderungen, die Sie machen machen eine Wirkung, werden Sie auch die folgende Methode aus dem NSTableViewDelegate Protokoll implementieren müssen: - (void) tableview: setObjectValue: forTableColumn: Reihe:

[Siehe Apple-Docs für Diese Funktion] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Protocols/NSTableDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/NSTableViewDataSource/tableView:objectValueForTableColumn:row :)

Wie üblich muss diese Methode in dem Objekt implementiert werden, das Sie als Delegat für das NSTableView-Objekt festgelegt haben.

[Siehe Apple-Docs auf die Delegierten im Fall, dass Sie einen Kommentar zu ihnen] (https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18)

+0

Ich glaube, dass die von Ihnen bereitgestellten Links zwar mit Ihrer Antwort übereinstimmten, die Apple-Dokumentation jedoch jetzt besagt, dass die Technik, die Sie in Ihrer Antwort angegeben haben, nur für zellenbasierte Tabellenansichten gilt. Jetzt empfiehlt Apple, dass wir View-basierte Tabellenansichten verwenden und anstatt die Delegate-Methode zu verwenden, - (void) tableView: setObjectValue: forTableColumn: row: um Werte zu setzen, die wir target/action verwenden. Kann mir jemand sagen, wie ich den Benutzer die Werte eines TableViews bearbeiten lassen kann und diese Werte mithilfe von target/action in mein Modell zurückbringen kann? – Kaydell