objective-c - Cocoa 绑定(bind)不从用户默认值中读取 nil 值

标签 objective-c macos cocoa cocoa-bindings

我有两个 UI 组件,其值通过用户默认值同步。第一个本质上是输入字段,另一个是菜单项。当输入字段的值发生变化时,菜单项的等效键通过 Cocoa 绑定(bind)发生变化:

Input Field -> NSUserDefaultsController -> User Defaults
User Defaults -> NSUserDefaultsController -> Menu Item

这对于除 nil 值之外的所有内容都适用。由于某种原因,我无法在用户默认值中存储实际的 nil 值,而是使用空字典。在读取值的另一端,我有一个转换器,可以将空字典“膨胀”为 nil 值。

现在,当我在输入字段中输入非零值时,它会传递到用户默认值,并一直正确传播到菜单项。当我输入“空”值时,空字典会正确存储在用户默认值中,但菜单项的绑定(bind)值不会更改。

我做错了什么?

最佳答案

我做错的是将菜单项上的绑定(bind)实现为 hack。我通过类别引入了 keyCombo 属性:

@interface NSMenuItem (Combo)
@property(assign, nonatomic) MASShortcut *keyCombo;
@end

这是绑定(bind)到用户默认值的属性。然后,由于我无法轻松地在类别中添加实例变量,因此我只是在 getter 中返回 nil:

@implementation NSMenuItem (Combo)

- (MASShortcut*) keyCombo
{
    return nil;
}

/* setter omitted */

@end

这种方法运行良好,直到我想通过绑定(bind)将属性设置为nil。因为 getter 总是返回 nil,所以 Cocoa 绑定(bind)机制认为不需要更新属性值,因为它似乎已经是 nil 了。

关于objective-c - Cocoa 绑定(bind)不从用户默认值中读取 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703665/

相关文章:

objective-c - 如何在 NSView (Mac OS X) 上显示徽章

ios - 方法无效 - 自定义单元格

objective-c - 为两个不同的 View 使用自定义键盘

mysql - 为什么我的端口 3306 关闭,即使我根本没有绑定(bind)地址和跳过网络线路?

apache-flex - 我可以将 Flex Builder 3 与 Mac OS X 10.7 Lion 一起使用吗?

objective-c - Reeder Mac 应用程序在切换文件夹时如何以动画方式显示列表?

objective-c - NSStackView 未正确布局 View

ios - XCode 6 TableView 单元格超出屏幕

macos - 如何使用 MAMP 从命令行运行 PHP 脚本?

objective-c - NSApplicaton 委托(delegate) - applicationDidFinishLaunching