我在 Interface Builder 中创建了几个 NSComboBoxes,一个以编程方式创建。
在 Interface Builder 中创建的 NSComboBoxes 是完美的。我将他们的值绑定到共享用户默认控制器,当他们的视图打开时,他们正以正确的值坐在那里。重要的是,这个值在 NSComboBox 中显示为“普通”文本。换句话说,该值未显示为选中状态。这就是我要的。
对于以编程方式创建的 NSComboBox,我使用 selectItemAtIndex:0 设置值。当我这样做时,选择了正确的项目——但文本似乎被选中。即,它突出显示和一切。我不想要这个。以下是我尝试过的解决方法:
(i) 获取字段编辑器并将插入点设置到文本的末尾。这不起作用,但奇怪的是,字段编辑器的字符串在执行此操作时为 nil 或为空。我不确定这是否是字段编辑器的正确行为。
(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 可以解决问题。不幸的是,窗口真的想专注于这个组合框,因为将 rejectsFirstResponder 设置回 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 上有一个类别,它变成“字符串”到一个属性。最后,这实际上并不能解决文本选择“问题”。
所以我剩下的唯一问题可能是为什么 [window makeFirstResponder:nil] 不能将焦点从组合框上移开。不是超级重要,但如果有人有想法,我会很好奇。