Давайте рассмотрим краткий пример, подобный приведенному ниже. Есть 3 столбца: firstName
, lastName
и fullName
.
В этом конкретном примере, допустим, мы хотим разрешить редактирование firstName
и lastName
только для редактирования, в то время как fullName
(который потенциально является производным от firstName
и lastName
) - нет. Вы можете установить это в Интерфейсном Разработчике, установив или сняв флажок редактируемого флажка для столбца таблицы. Для этого 3 раза кликните по одному из столбцов таблицы (не по заголовку, а внутри вида структуры); сначала выбирается NSScrollView
, затем NSOutlineView
, затем NSTableColumn
:
Вы бы установили атрибуты следующим образом:
Это обеспечивает начало, устанавливая редактируемое значение по умолчанию для всего столбца. Если вам нужно больше контроля над тем, должно ли значение элемента конкретной строки быть редактируемым или нет, вы можете использовать метод делегата outlineView:shouldEditTableColumn:item:
:
#pragma mark -
#pragma mark <NSOutlineViewDelegate>
- (BOOL)outlineView:(NSOutlineView *)anOutlineView
shouldEditTableColumn:(NSTableColumn *)tableColumn
item:(id)item {
if ([[tableColumn identifier] isEqualToString:@"firstName"] ||
[[tableColumn identifier] isEqualToString:@"lastName"]) {
return YES;
} else if ([[tableColumn identifier] isEqualToString:@"fullName"]) {
return NO;
}
return YES;
}
Если вы хотите контролировать возможность выбора определенной строки в виде структуры (например, вы можете запретить выбор элемента группы), вы можете использовать outlineView:shouldSelectItem:
.
- (BOOL)outlineView:(NSOutlineView *)anOutlineView shouldSelectItem:(id)item {
// if self knows whether it should be selected
// call its fictional isItemSelectable:method:
if ([self isItemSelectable:item]) {
return YES;
}
/* if the item itself knows know whether it should be selectable
call the item's fictional isSelectable method. Here we
are assuming that all items are of a fictional
MDModelItem class and we cast `item` to (MDModelItem *)
to prevent compiler warning */
if ([(MDModelItem *)item isSelectable]) {
return YES;
}
return NO;
}