通过Objective-c中的绑定在NSComboBoxCell上自动完成

时间:2013-01-16 15:32:35

标签: objective-c macos cocoa binding nstableview

我不知道我是否错误地设置了这个,但我所做的对我来说是有意义的。

我有一个NSTableView,里面有两列 - 左边是属性列,右边是值列。 values列包含NSComboBoxCells,它们将(动态地)预先填充与左列中属性相关的值。

该表绑定到引用对象数组的NSArrayController。引用的对象定义了许多属性,包括属性列的一个属性(属性称为“名称”),值列的值(称为“值”),以及返回可用值的NSArray的possibleValues属性依赖于财产。

只要未编辑值单元格,这一切都正常工作。编辑完成后,可能值的下拉列表为空。

搜索过后,我发现建议应检查组合框单元格的自动完成复选框,但检查它不会改变行为。我希望用户能够从一个表格单元格切换到下一个表格单元格,保持编辑模式,并且能够使用预先填充的可能值列表。

在包含要在表中显示的数据的对象上,我已经声明了keyPathsForValuesAffecting ...方法:

+ (NSSet *)keyPathsForValuesAffectingPossibleValues
{
    return [NSSet setWithObject:@"name"];
}

详细的绑定是这样的:

属性列绑定到arrayController

价值绑定:

    Controller Key: arrangedObjects
    Model Key Path: name

列绑定到同一个arrayController

内容绑定:

    Controller Key: arrangedObjects
    Model Key Path: possibleValues

价值绑定:

    Controller Key: arrangedObjects
    Model Key Path: value

NSComboBoxCell 不受任何限制。我已经尝试将单元格的内容绑定到与值列的值绑定相同,但是我得到了一个对象列表 - 而不是我创建的字符串列表。

存储在NSMutableArray中的对象的头文件绑定到NSArrayController基本上看起来像:

#import <Foundation/Foundation.h>

@interface TableProperty : NSObject {
    NSString *name;
    NSString *value;
}

@property (readwrite, strong) NSString *name;
@property (readwrite, strong) NSString *value;
@property (readonly, assign) NSArray *possibleValues;

@end

合成名称和值属性。 possibleValues属性是一个返回NSString对象数组的方法 - 其内容取决于name的值。

我在possibleValues方法中设置了一个断点,当在单元格上启动编辑模式时,它会被击中(两次)(两次都返回正确的NSArray)。一旦进入编辑模式,按下键盘上的DOWN按钮会弹出一个空框 - 这是我想要填充值的那个框。如果用鼠标单击单元格右侧的选择箭头,我会得到正确值列表。

我无法使用基于视图的表,因为我需要此应用程序才能在Snow Leopard计算机上运行。

1 个答案:

答案 0 :(得分:1)

NSComboBoxCell从NSTextFieldCell继承自动完成功能,该功能要求您提供数据源。没有绑定可以为您实现功能。这样做的原因是控件正在使用NSStrings,您的列表可以有多个具有相同字符串表示的项目。