将复选框绑定到共享用户默认值

时间:2013-04-10 23:37:14

标签: cocoa cocoa-bindings

我正在构建一个表格以在我的偏好设置面板中显示一些数据。所有数据都存在于NSUserDefaults中。表格中有一个复选框,用于启用/禁用所列设备的数据。该复选框是唯一可编辑的单元格。

该表正在显示共享用户默认值中的数据。所以我知道我已将表内容正确映射到正确的共享用户默认值模型密钥路径。但是,当我切换复选框时,新数据根本没有被写入默认值。

以下是复选框设置的一瞥...

enter image description here

我已经尝试将选择器操作分配给NSButton(复选框),认为我可以通过编程方式设置默认值。奇怪的是,这个动作永远不会被触发。我设置了一个简单的动作,只做了一个NSLog。单击复选框时,它永远不会被触发。

更新:这样你可以看到我的默认数据结构是什么样的,这是defaults命令的输出。这个表背后没有任何代码。

{
    ClimateDeviceData =     (
                {
            deviceName = Nest;
            deviceSetting = "76";
            display = 1;
            structure = Home;
            uuid = d01AA02AB145204VR;
        }
    );
    ClimateLoginAtLaunch = 1;
    ClimateMenuBarIconStyle = "Nest Temp Settings";
}

更新#2 :此时我会接受一个解决方案,只需从复选框中调用选择器即可。

3 个答案:

答案 0 :(得分:1)

如果您不将NSButton(复选框)绑定到Shared User Defaults Controller而不是图片中,Table Cell View

答案 1 :(得分:1)

我在应用程序中做了大致相同的事情。不完全是,但基本原理是一样的。一个填充了绑定的表,其中有一个按钮(可以是复选框或其他按钮,无关紧要)。

我尝试了按钮上的操作,但它也没有用,所以最后,我使用了KVC概念。

  • 我在XIB中使用了一个arrayController,在我的代码中引用了一个可变数组,该数组存储了一个具有status属性(boolean)的自定义对象的实例。
  • 基于视图的tableview使用arrangeObjects控制器键绑定到arrayController。
  • 按钮绑定到tableCellView(已排列的对象),使用该keyPath:objectValue.status(有效地获取该行上自定义对象的status属性)。

在我的控制器代码中,我使用以下行创建包含自定义对象的可变数组:

  smartApp *appFound = [[smartApp alloc] initWithApplicationIdentifier:key];

  if (appFound)
  {
      [appFound setStatus:[NSNumber numberWithBool:YES]];

      [appFound addObserver:self
                 forKeyPath:@"status"
                    options:(NSKeyValueObservingOptionNew |
                             NSKeyValueObservingOptionOld)
                    context:NULL];

      [_appsArray addObject:appFound];
  }

我在该对象的'status'键路径上添加了一个观察者。然后我添加了挂起的代码,观察对象的值变化:

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)anObject
                    change:(NSDictionary *)change
                   context:(void *)context
{
    if ([anObject isKindOfClass:[smartApp class]])
    {
        if ([keyPath isEqual:@"status"])
        {
            NSLog(@"Clicked on row: %lu", (unsigned long)[self.appsArray indexOfObject:anObject]);
        }
    }
}

一旦进入方法,就可以做你想做的事。它肯定会被调用,并且您获得的对象与您单击的行,更改字典和键路径相匹配。

希望有所帮助

答案 2 :(得分:0)

是的,基于视图的表视图有所不同。 (我只是自己学习。)在基于视图的表视图中,Table Cell View的objectValue是该行表示的对象。将文本字段,复选框等绑定到该objectValue的键路径。