Was würde verhindern, dass eine bearbeitbare NSTableColumn beim Doppelklick bearbeitet werden kann?
-
22-12-2019 - |
Frage
Ich habe eine NSTableView
mit einer einzigen Spalte.In dieser Spalte ist im Interface Builder "Bearbeitbar" aktiviert, aber ein Doppelklick auf eine Zelle in der Tabellenansicht führt zu nichts.Ich habe bestätigt (in -tableView:viewForTableColumn:row:
durch Überprüfen [tableColumn isEditable]
), dass für die Tabellenspalte das editierbare Flag gesetzt ist.Was würde verhindern, dass die Spalte bearbeitet wird, wenn isEditable == YES
?
Es wurde vorgeschlagen, dass ich meine Datenquelle und meinen Delegiertencode einschließe.Der dataArray
ist eine Eigenschaft, die speichert NSManagedObject
Unterklassenobjekte. listPopupButton
wählt aus, welche Entität in einem angezeigt werden soll NSTableView
das kann verschiedene Entitäten anzeigen, die alle nur ein Namensattribut haben (wie durch die nameOnlyItems
methode, die ein Array von diesen zurückgibt).
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [[self dataArray] count];
}
- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row {
NSTableCellView *cellView;
NSNumber *index = [NSNumber numberWithInteger:[[self listPopupButton] indexOfSelectedItem]];
if ([[self nameOnlyItems] containsObject:index]) {
CVCAbstractEntity *entity = [[self dataArray] objectAtIndex:row];
NSString *name = [entity name];
cellView = [tableView makeViewWithIdentifier:@"nameOnly" owner:self];
[[cellView textField] setStringValue:name];
} else if ([index integerValue] == CVCListPopUpIndexPublishers) {
CVCPublisher *publisher = [[self dataArray] objectAtIndex:row];
NSString *identifier = [tableColumn identifier];
NSString *content;
content = [[publisher valueForKeyPath:identifier] description];
if ([identifier containsString:@"year"] && [content isEqualToString:@"0"]) {
content = @"";
}
cellView = [tableView makeViewWithIdentifier:identifier owner:self];
[[cellView textField] setStringValue:content ? content : @""];
} else if ([index integerValue] == CVCListPopUpIndexSeries) {
CVCSeries *series = [[self dataArray] objectAtIndex:row];
NSString *identifier = [tableColumn identifier];
NSString *content;
content = [[series valueForKeyPath:identifier] description];
if ([identifier containsString:@"year"] && [content isEqualToString:@"0"]) {
content = @"";
}
cellView = [tableView makeViewWithIdentifier:identifier owner:self];
[[cellView textField] setStringValue:content ? content : @""];
}
return cellView;
}
- (void)tableView:(NSTableView *)tableView sortDescriptorsDidChange:(NSArray *)oldDescriptors {
NSMutableArray *mutableDataArray = [[self dataArray] mutableCopy];
[mutableDataArray sortUsingDescriptors:[tableView sortDescriptors]];
[self setDataArray:mutableDataArray];
[[self nameOnlyTableView] reloadData];
}
Lösung
Es stellt sich heraus, dass nicht nur die Tabellenspalte bearbeitet werden muss, sondern auch das Textfeld in der Zellenansicht.Durch Auswahl dieses Textfelds und Auswahl von Bearbeitbar aus dem Menü Verhalten wurde das Problem behoben.