2010-06-30 41 views
2

我有几个NSComboBoxes在Interface Builder中创建,并且以编程方式创建。如何通过KVC设置NSComboBox的值?

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

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

(i)获取字段编辑器并将插入点设置为文本末尾。虽然奇怪的是,在这样做时,字段编辑器的字符串不是零就是空。我不确定这是否是现场编辑的正确行为。

(II)尝试设置在组合框的值的各种其他方式,如setObjectValue,takeStringValueFrom等

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

所以,我有两个问题:

首先,没有人知道如何为NSComboBox设置默认值编程,这样在框中的文本未选中?如果涉及到这一点,我将尽全力做到这一点,包括一个新的NSComboBoxCell子类。

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

我一直在这个工作了很多小时,现在我真的很disspirited!


谢谢,mustISignUp!很高兴有这个修复。一点后续:

(i)选择的文本肯定是由焦点造成的。调用setRefusesFirstResponder:YES修复了这个问题。不幸的是,该窗口真的想把重点放在这个组合框上,因为设置拒绝FirstResponder返回到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]无法使焦点离开组合框。不是非常重要,但如果有人有想法,我会好奇的。

回答

2

首先,我认为文本被选中是因为调用selectItemAtIndex:已将comboBox设置为firstResponder。您可以使用setRefusesFirstResponder:YES或者您可以让另一个项目成为第一个响应者,以使文本不会显示为选中状态。

如果我理解正确,并且想要更改组合框的选择,请按照正确的方式进行操作。其次,你很迷惑Bindings和KVC。 NSComboBox有一个名为“值”的绑定,而不是称为“值”的属性。尝试使用setValue:forKey:来设置它是没有意义的,Interface Builder肯定不会这样做。

你会觉得这是不明显的,令人困惑,也许更好的名字可能已被选定为绑定。

+0

感谢!请参阅上面的我的后续响应,作为对问题的编辑。 – Dennis

+0

我没有真正的答案,但如果你没有使用FScript来帮助你这样的事情,你一定会想。将FScript框架放在Library/Frameworks中,并与其链接。添加[[NSApp mainMenu] addItem:[[FScriptMenuItem alloc] init]];到-applicationDidFinishLaunching。启动您的应用程序并查看FScript menuItem。从菜单启动一个“浏览器查看”,你现在可以选择你的窗口,视图或组合框,并尝试发送消息。这对于像这样的东西是非常宝贵的。 – hooleyhoop

+0

看起来很棒。感谢这个指针。 – Dennis