我目前正在一个带有 NSOutlineView 的项目中工作......
当然,我使用 NSCell(s),我需要让选择单元格内的文本的能力......或者至少......阻止单元格的选择(和突出显示)......
我在 IB 上搜索了所有选项,但找不到合适的选项...
有没有办法以编程方式阻止选择/突出显示单元格,也不让用户选择单元格内容?
谢谢 =)
我目前正在一个带有 NSOutlineView 的项目中工作......
当然,我使用 NSCell(s),我需要让选择单元格内的文本的能力......或者至少......阻止单元格的选择(和突出显示)......
我在 IB 上搜索了所有选项,但找不到合适的选项...
有没有办法以编程方式阻止选择/突出显示单元格,也不让用户选择单元格内容?
谢谢 =)
这与 NSCell 无关,也许您希望outlineView:shouldSelectItem:
在您的委托中实现。
在 NSCell 上,setEnabled:NO
, 也可能有帮助。从文档中:
setEnabled:(BOOL)flag
禁用单元格的文本变为灰色。如果一个单元格被禁用,它不能被突出显示,不支持鼠标跟踪(因此不能参与目标/动作功能),并且不能被编辑。但是,您仍然可以通过编程方式更改禁用单元格的许多属性。(例如,setState: 方法仍然有效。)
尝试设置:
cell.selectionStyle = UITableViewCellSelectionStyleNone;
您也可以尝试覆盖 highlightSelectionInClipRect:,但我不完全确定这会奏效。
让我们举一个简单的例子,如下面的大纲视图。有 3 列:firstName
、lastName
和fullName
。
在这个特定的示例中,假设我们只想允许firstName
andlastName
是可编辑的,而fullName
(可能源自firstName
and lastName
)不是。您可以通过选中或取消选中表格列的可编辑复选框来在 Interface Builder 中进行设置。为此,请在其中一个表格列上单击 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;
}