Что помешает редактировать редактируемый NSTableColumn при двойном щелчке?
-
22-12-2019 - |
Вопрос
у меня есть NSTableView
с одной колонкой.Для этого столбца в Интерфейсном Разработчике установлен флажок «Редактируемый», но двойной щелчок по ячейке в представлении таблицы ничего не дает.Я подтвердил (в -tableView:viewForTableColumn:row:
проверив [tableColumn isEditable]
), что в столбце таблицы установлен редактируемый флаг.Что помешает редактированию столбца, если isEditable == YES
?
Было предложено включить мой источник данных и код делегата.А dataArray
это собственность, которая хранит NSManagedObject
объекты подкласса. listPopupButton
выбирает, какой объект будет просматриваться в NSTableView
которые могут отображать разные сущности, все из которых имеют только атрибут имени (как указано в nameOnlyItems
метод, который возвращает их массив).
- (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];
}
Решение
Оказывается, редактируемым должен быть не только столбец таблицы, но и текстовое поле в представлении ячейки.Выбор этого текстового поля и выбор параметра «Редактируемый» в меню «Поведение» решили проблему.