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

Cocoa 将复选框绑定到共享用户默认值,cocoa,cocoa-bindings,Cocoa,Cocoa Bindings,我正在构建一个表,以便在首选项窗格中显示一些数据。所有数据都保存在NSUserDefaults中。表中有一个复选框,用于启用/禁用所列设备的数据。复选框是唯一可编辑的单元格 该表正确显示了共享用户默认值中的数据。因此,我知道我已将表内容正确映射到正确的共享用户默认模型密钥路径。但是,当我切换复选框时,新数据根本不会写入默认值 这里是一个在复选框设置一瞥 我曾尝试将选择器操作分配给NSButton(复选框),认为可以通过编程方式设置默认值。奇怪的是,这个动作从未被触发。我设置了一个简单的操作,只

我正在构建一个表,以便在首选项窗格中显示一些数据。所有数据都保存在NSUserDefaults中。表中有一个复选框,用于启用/禁用所列设备的数据。复选框是唯一可编辑的单元格

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

这里是一个在复选框设置一瞥

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

更新:为了查看我的默认数据结构,这里是defaults命令的输出。这张表后面实际上没有任何代码

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

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

如果您不将
NSButton
(复选框)绑定到
共享用户默认控制器上,而不是像图中所示,
表格单元格视图

是的,这与基于视图的表视图不同。在基于视图的表视图中,表单元视图的objectValue是由该行表示的对象。您可以将文本字段、复选框等绑定到该objectValue的关键路径。

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

我尝试了按钮上的操作,但也不起作用,所以最后,我使用了KVC概念

  • 我在XIB中使用arrayController引用代码中的可变数组,该数组存储具有状态属性(布尔)的自定义对象的多个实例
  • 基于视图的tableview使用arrangedObjects控制器键绑定到arrayController
  • 该按钮绑定到tableCellView(排列的对象),使用该键路径: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];
  }
我在该对象的“状态”键路径上添加了一个观察者。我添加了挂起的代码,观察对象的值变化:

- (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]);
        }
    }
}
一旦你掌握了方法,你可以做你想做的事。它肯定会被调用,您会得到与您单击的行、更改字典和键路径相匹配的对象


希望这会有所帮助

我尝试了很长时间,甚至根本无法显示数据。不过,我会将表视图绑定到共享用户默认控制器。在基于单元格的表中,您应该始终绑定到列,而不是单元格。不清楚您将表视图单元格视图绑定到数据的级别,但是否可能需要更高级别?ClimateDeviceData.display?表视图绑定到共享用户默认控制器,并且模型密钥路径已设置为“ClimateDeviceData”。