无法在禁用的NSTableView中禁用Checkbox(NSButton)

时间:2015-04-13 22:34:13

标签: objective-c macos

我的应用包含一个包含2列的NSTableView实例。一栏是这样的一个例子:

#import <Cocoa/Cocoa.h>
@class NSTableView;
@interface MMCheckboxTableCellView : NSTableCellView
@property (weak) IBOutlet NSButton *checkboxField;
@end

并且实现都是样板文件,根本没有添加自定义代码。在代码中,NSTableView实例基于应用程序的各种状态以编程方式设置tableview.enabled = YES(或NO)。禁用tableview时,表中的另一列(仅显示)将停止响应单击操作,如预期的那样。上面的复选框列继续响应点击,并允许用户选中/取消选中按钮实例。

为了尝试解决此问题,我在复选框列中添加了一个文本字段(它没有连接到任何内容),并且当禁用tableview时,无法在字段中输入文本。 NSButton有什么特别之处吗?是否有可能因为我从NSTableCellView派生了这个类并添加了Check Box而不是使用Check Box Cell我遇到了这个问题?

3 个答案:

答案 0 :(得分:0)

我终于弄明白了。看来即使NSButton嵌入在NSTableView中,表上的设置enabled = NO也不能控制按钮的行为。最终使这项工作成功的唯一方法是根据应用程序的状态调用setEnabled控件。这必须在渲染单元格时发生,因此当状态发生变化时,还需要调用NSTableView:reloadData,以便可见单元格立即重绘。

答案 1 :(得分:0)

作为替代方案,我决定通过设置与我的布尔属性匹配的计算属性来解决同样的问题,该属性返回空白或复选标记字符(✓)。然后绑定到此字段作为正常的NSTextfield,启用/禁用工作。

    // Swift 
    // Computed variables on model for readonly display in table
    var bIosText:String     {return bIos ? "✓" : " " }
    var bAndroidText:String {return bAndroid ? "✓" : " " }

我认为看起来很不错:

enter image description here

当然这只是解决方案的一部分,如果你想启用编辑,你需要有多个列,并根据需要隐藏/取消隐藏。

答案 2 :(得分:0)

请勿在表格视图中嵌入NSButton,而只能使用NSButtonCell。如果您的NSTableView基于视图,它将切换到基于单元格(至少Xcode为我做了)。

所以这是错误

view based, with NSButton

这是正确

cell based

此更改后,足以禁用/启用表格视图,按钮单元将相应地起作用。