2012-12-06 20 views
5

Ich erstellte eine View-BasedNSTableView mit einer einzigen Spalte. Diese Spalte ist mit einem Standard NSTableCellView von Interface Builder bestückt (ich wählte die Version mit Bild und Textfeld).Machen Sie eine NSTableCellView editierbare

Jetzt möchte ich das Textfeld in der Spalte editierbare machen.

Mein erster Versuch war, den NSTextField von Interface Builder zu ändern und sein Verhalten als Editable festzulegen. Es funktioniert, in der Tat, wenn ich eine Zeile auswähle und ich drücke die enter key das Feld wird editierbar und ich kann seinen Wert ändern. Ich dachte, dass ich in der Lage sein würde, diese Änderung dank einiger NSTableViewDataSource Methode wie tableView:setObjectValue:forTableColumn:row: abzufangen, aber diese Methode wird nie als Reaktion auf eine Textfeldbearbeitung aufgerufen.

Welcher Art ist der richtige Umgang mit bearbeitbaren Feldern in einem View-basierten NSTableView-System? Ich nehme an, dass das NSTableViewDataSource etwas damit zu tun hat, aber ich weiß nicht, wie man seine Methoden nennt.

+0

Sie nicht sagen * warum * Sie bearbeiten abfangen wollen? – trojanfoe

+0

Weil ich den Wert verwenden muss, um Daten in der Datenquelle zu bearbeiten. – MatterGoal

Antwort

1

Klingt so, als müssten Sie die NSView, die sich in der NSTableView Zelle befindet, unterklassifizieren und die Unterklassenansicht zu einem Stellvertreter des Textfelds machen. Ihre Ansicht wird dann Text Änderungsbenachrichtigungen über die NSTextField Delegatmethode erhalten:

- (void)textDidChange:(NSNotification *)notification; 
3

Erstellen einer Unterklasse von NSTableCellView. (Die entsprechenden Dateien .h und .m) Lassen Sie die Klasse auf das NSTextFieldDelegate-Protokoll reagieren. Implementieren Sie das Steuerelement: textShouldEndEditing: method. Machen Sie diese Unterklasse zum Delegaten Ihres Label-Steuerelements.

Hier ist ein Beispielcode.

CategoryListCell.h

@interface CategoryListCell : NSTableCellView 
@end 

CategoryListCell.m

@interface CategoryListCell()<NSTextFieldDelegate> 
@property (weak) IBOutlet NSTextField *categoryLabel; 
@property (assign) BOOL editing; 
@property (copy) NSString* category; 
@end 

@implementation CategoryListCell 
- (BOOL)control:(NSControl*)control textShouldBeginEditing:(NSText *)fieldEditor { 
    self.editing = YES; 
    return YES; 
} 

- (BOOL)control:(NSControl *)control textShouldEndEditing:(NSText *)fieldEditor; { 
    if (self.editing) { 
     self.editing = NO; 
     [self mergeFromSource:self.category toDestination:self.categoryLabel.stringValue]; 
    } 
    return YES; 
} 

- (void)mergeFromSource:(NSString*)source toDestination:(NSString*) destination { 
// your work here 
} 

@end