0

我目前正在一个带有 NSOutlineView 的项目中工作......

当然,我使用 NSCell(s),我需要让选择单元格内的文本的能力......或者至少......阻止单元格的选择(和突出显示)......

我在 IB 上搜索了所有选项,但找不到合适的选项...

有没有办法以编程方式阻止选择/突出显示单元格,也不让用户选择单元格内容?

谢谢 =)

4

3 回答 3

2

这与 NSCell 无关,也许您希望outlineView:shouldSelectItem:在您的委托中实现。

在 NSCell 上,setEnabled:NO, 也可能有帮助。从文档中:

setEnabled:(BOOL)flag

禁用单元格的文本变为灰色。如果一个单元格被禁用,它不能被突出显示,不支持鼠标跟踪(因此不能参与目标/动作功能),并且不能被编辑。但是,您仍然可以通过编程方式更改禁用单元格的许多属性。(例如,setState: 方法仍然有效。)

于 2011-01-26T18:59:04.127 回答
0

尝试设置:

cell.selectionStyle = UITableViewCellSelectionStyleNone;

您也可以尝试覆盖 highlightSelectionInClipRect:,但我不完全确定这会奏效。

于 2011-01-26T19:00:45.693 回答
0

让我们举一个简单的例子,如下面的大纲视图。有 3 列:firstNamelastNamefullName

在此处输入图像描述

在这个特定的示例中,假设我们只想允许firstNameandlastName是可编辑的,而fullName(可能源自firstNameand 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;
}
于 2011-01-26T21:26:48.770 回答