【问题标题】:Select text (content) instead of cell with NSCell使用 NSCell 选择文本(内容)而不是单元格
【发布时间】:2011-01-26 18:49:19
【问题描述】:

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

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

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

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

谢谢 =)

【问题讨论】:

    标签: objective-c macos nsoutlineview nscell


    【解决方案1】:

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

    在 NSCell 上,setEnabled:NO 也可能有所帮助。来自文档:

    setEnabled:(BOOL)flag

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

    【讨论】:

    • 谢谢 :) 我认为这是正确的方法 :) 但是在单元格中选择文本呢?
    • 更新了答案,也许是你需要的:P
    【解决方案2】:

    尝试设置:

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    

    您也可以尝试覆盖 highlightSelectionInClipRect:,但我不完全确定这是否可行。

    【讨论】:

    • 除了 iOS 和 UITableViewCell :) 我说的是 Mac OS 中的 NSCell :)
    【解决方案3】:

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

    在这个特定示例中,假设我们只想允许 firstNamelastName 可编辑,而 fullName(可能源自 firstNamelastName)不可编辑。您可以通过选中或取消选中表格列的可编辑复选框来在 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;
    }
    

    【讨论】:

    • 谢谢,但这不是我的问题,我不希望单元格可编辑或可选择,我希望 cells content 可选择...即包含“ abcd”,我希望能够选择 abc(如文本区域)等...
    猜你喜欢
    • 2021-03-29
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2013-07-01
    • 2015-06-02
    • 1970-01-01
    相关资源
    最近更新 更多