2

我在 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] 不能将焦点从组合框上移开。不是超级重要,但如果有人有想法,我会很好奇。

4

1 回答 1

2

首先,我认为选择文本是因为调用selectItemAtIndex:使组合框成为第一个响应者。您可以使用setRefusesFirstResponder:YES或者您可以使另一个项目成为第一响应者,以使文本未显示为选中状态。

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

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

你会认为这是不明显和令人困惑的,也许可以为绑定选择更好的名称。

于 2010-06-30T23:22:09.963 回答