【问题标题】:Cocoa bindings not reading a nil value from user defaultsCocoa 绑定未从用户默认值中读取零值
【发布时间】:2015-08-22 14:18:19
【问题描述】:

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

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

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

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

我做错了什么?

【问题讨论】:

    标签: objective-c macos cocoa cocoa-bindings


    【解决方案1】:

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

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

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

    @implementation NSMenuItem (Combo)
    
    - (MASShortcut*) keyCombo
    {
        return nil;
    }
    
    /* setter omitted */
    
    @end
    

    在我想通过绑定将属性设置为 nil 之前,这一直很好。因为 getter 总是返回 nil,Cocoa 绑定机制认为不需要更新属性值,因为它似乎已经是 nil

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 2012-07-20
      • 2012-06-22
      • 1970-01-01
      • 2011-01-15
      • 2021-12-18
      • 1970-01-01
      相关资源
      最近更新 更多