objective-c - 带有 NSCheckBox 单元格的 NSTableView - 如何拦截行选择?

标签 objective-c macos cocoa swift nstableview

我有一个 NSTableView,其单元格包含 NSCheckBox。我想更改它的行为,以便可以单击表格中的任何行,并相应地打开/关闭该行中的复选框。

我觉得可以用

    func tableView(tableView: NSTableView, shouldSelectRow row: Int) -> Bool {
}

此方法提供被单击行的索引,我可以使用它以编程方式从那里切换复选框。但问题是 NSCheckBox 会拦截鼠标在其行上的点击。有什么方法可以禁用它以便可以完全单击行?将 NSCheckBox 的启用状态设置为 false 将允许这样做,但它也会使复选框及其标题变灰。

编辑:

阐明我需要什么:(基于 View 的)表格单元格 View 包含一个复选框。如果用户单击复选框,它会切换,但是当在没有复选框的任何地方单击该行时,什么也不会发生。我希望单击该行并相应地切换复选框。所以基本上我希望复选框不可点击,并且表格行在单击该行时通知其中的复选框。

最佳答案

在基于单元格的 TableView 中,您可以实现-selectionShouldChangeInTableView:。我假设这也适用于基于 View 的 TableView 。

- (BOOL)selectionShouldChangeInTableView:(NSTableView *)tableView
{
    NSInteger clickedColumn = tableView.clickedColumn;
    NSInteger attributeEnabledColumn = [tableView columnWithIdentifier:@"attributeEnabled"];

    if (clickedColumn == attributeEnabledColumn) {
        NSInteger clickedRow = tableView.clickedRow;

        if (clickedRow >= 0) {
            NSArrayController  *attributesArrayController = self.attributesArrayController;
            NSMutableDictionary *attributeRow = [attributesArrayController.arrangedObjects objectAtIndex:clickedRow];
            BOOL attributeEnabled = [attributeRow[kAttributeSelectionAttributeEnabledKey] boolValue];

            attributeRow[kAttributeSelectionAttributeEnabledKey] = @(!attributeEnabled);
        }

        return NO;
    }

    return YES;
}

关于objective-c - 带有 NSCheckBox 单元格的 NSTableView - 如何拦截行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29998810/

相关文章:

cocoa - 基于 View 的 NSOutlineView 中的 Finder 样式 float 组行

objective-c - 具有(复杂)关系和核心数据/RAILS 的 Restkit

ios - 如何检测 NSString 是否包含特定字符?

objective-c - 使用 "animation"以编程方式单击 NSPushButton

java - 使 OS X 屏幕 JMenuBar 跨窗口一致工作的最佳方法是什么?

macos - 查找并替换为 sed 和 regex

objective-c - 在 OSX 中更新 sqlite3 数据库的列

ios - 如何删除两个手势识别器之间的依赖关系?

ios - Realm 文件的大小是如何发展的?

macos - 苹果操作系统 X : Launching an app using NSWorkspace from a daemon doesn't work if the daemon is run as root