【问题标题】:How to set value of NSComboBox by KVC?如何通过 KVC 设置 NSComboBox 的值?
【发布时间】:2010-07-01 22:01:44
【问题描述】:

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

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

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

(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 上有一个类别,它变成“字符串”到一个属性。最后,这实际上并不能解决文本选择“问题”。这个组合框的文本选择和 Interface Builder 中的文本选择之间的区别必须是它们在窗口中的位置......我猜这个组合框只是计划成为 initialFirstResponder 而其他的不是。

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

【问题讨论】:

    标签: objective-c cocoa nscell nscombobox


    【解决方案1】:

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

    如果我理解正确并且您想更改组合框的选择,那么您的做法是正确的。

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

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

    【讨论】:

    • 谢谢!请参阅上面我的后续回复,作为对问题的修改。
    • 我真的没有答案,但如果您不使用 FScript 来帮助您解决此类问题,您肯定会想要。将 FScript 框架放在 Library/Frameworks 中,链接它。添加 [[NSApp mainMenu] addItem:[[FScriptMenuItem alloc] init]];到-applicationDidFinishLaunching。启动您的应用程序并查看 FScript menuItem。从菜单启动“浏览器查看”,您现在可以选择您的窗口、视图或组合框并尝试向其发送消息。对于这样的东西,它是无价的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    相关资源
    最近更新 更多