如何通过KVC设置NSComboBox的值?

时间:2010-06-30 18:28:18

标签: objective-c cocoa nscell nscombobox

我在Interface Builder中创建了几个NSComboBox,并且以编程方式创建了一个。

在Interface Builder中创建的NSComboBox是完美的。我将它们的值绑定到共享用户默认控制器,并且当它们的视图打开时,它们将以正确的值坐在那里。重要的是,此值在NSComboBox中显示为“普通”文本。换句话说,该值不会显示为选中状态。这就是我想要的。

对于以编程方式创建的NSComboBox,我使用selectItemAtIndex:0设置值。当我这样做时,选择了正确的项目 - 但选择了文本 。即,它突出了一切。我不想要这个。以下是我尝试过的解决方法:

(i)获取字段编辑器并将插入点设置为文本的结尾。这不起作用,但奇怪的是,字段编辑器的字符串在执行此操作时为nil或empty。我不确定这是否是字段编辑器的正确行为。

(ii)尝试各种其他设置组合框值的方法,例如setObjectValue,takeStringValueFrom等。

(iii)最后,最令人沮丧的是,我尝试使用[myComboBox setValue:@“The Default Item”forKey:@“value”]设置NSComboBox的值;这与objc_exception_throw失败,可能是因为没有这样的KVC密钥。但我知道组合框的值可以由KVO设置,因为它适用于界面构建器!我猜我不知道正确的关键路径。我试图使用内省枚举所有属性,但我无法使代码正常工作(objc_property_t不在预期的头文件中)。

所以,我有两个问题:

首先,是否有人知道如何以编程方式为NSComboBox设置默认值,以便未选中框中的文本?我会尽力做到这一点,包括一个新的NSComboBoxCell子类,如果涉及到这一点。

其次,有人可以告诉我IB用于设置NSComboBox值的键或键路径是什么?或者,为什么我这样做的努力失败了?

我已经在这方面工作了好几个小时了,我真的很沮丧!


谢谢,谢谢!很高兴能解决这个问题。一点点跟进:

(i)选择文本肯定是由焦点引起的。调用setRefusesFirstResponder:YES可以解决问题。不幸的是,窗口真的想要专注于这个组合框,因为将refusesFirstResponder设置回NO(稍后,在窗口初始化之后)会再次导致文本选择(我希望用户能够根据需要关注此框)。因此,在我的情况下,最终的解决方案是调用[window makeFirstResponder:otherControl]。奇怪的是,虽然[window makeFirstResponder:nil]不起作用。有什么想法吗?

(ii)感谢指出绑定和属性之间的区别。在研究这个问题时我学到了很多东西。首先,我了解到你可以通过调用 - (NSArray *)exposedBindings来获取绑定列表,这对于NSComboBox返回(fontSize,alignment,toolTip,fontName,enabled,contentValues,fontFamilyName,font,hidden,fontItalic,textColor,value ,内容,可编辑,fontBold)。其次,我能够使用[myComboBox bind:@“value”toObject:[NSMutableString stringWithString:@“defaultValue”] withKeyPath:@“string”options:nil]设置值,其中NSMutableString上有一个类别,它变为“字符串“成为一个属性。最后,这实际上并没有解决文本选择“问题”。使用此组合框的文本选择与Interface Builder中的文本选择之间的区别必须是它们在窗口中的位置...我猜这个组合框只是成为initialFirstResponder而其他组合框不是。

所以我唯一剩下的问题可能就是为什么[window makeFirstResponder:nil]无法将焦点从组合框中移开。不是非常重要,但如果有人有想法,我会很好奇。

1 个答案:

答案 0 :(得分:2)

首先,我认为文本被选中是因为调用selectItemAtIndex:使得comboBox成为第一个响应者。你可以使用setRefusesFirstResponder:YES或者你可以让另一个项目成为第一个响应者,使文本看起来不会被选中。

如果我理解正确并且您想要更改组合框的选择,那么您正在以正确的方式进行操作。

其次,你在混淆Bindings和KVC。 NSComboBox有一个名为“value”的绑定,而不是名为“value”的属性。尝试使用setValue:forKey:设置它是没有意义的,Interface Builder肯定不会这样做。

你认为这是不明显和令人困惑的,你可能会选择更好的名字作为绑定。