【问题标题】:Binding a checkbox to Shared User Defaults将复选框绑定到共享用户默认值
【发布时间】:2013-04-10 23:37:13
【问题描述】:

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

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

这里是复选框设置的一瞥...

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

更新:你可以看到我的默认数据结构是什么样子的,这里是默认命令的输出。这张表后面实际上没有任何代码。

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

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

【问题讨论】:

  • 尚不清楚您将表格视图单元格视图绑定到数据的级别,但您是否可能需要更高级别? ClimateDeviceData.display?
  • 表视图绑定到共享用户默认控制器,模型键路径已设置为“ClimateDeviceData”。

标签: cocoa cocoa-bindings


【解决方案1】:

您是否应该将NSButton(复选框)绑定到Shared User Defaults Controller,而不是图中所示的Table Cell View

【讨论】:

  • 我尝试了很长时间,但根本无法获得要显示的数据。我确实将表视图绑定到共享用户默认控制器。
  • 在基于单元格的表格中,您应该始终绑定到,而不是单元格。
【解决方案2】:

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

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

  • 我在 XIB 中使用了一个 arrayController,它在我的代码中引用了一个可变数组,该数组存储了具有状态属性(布尔值)的自定义对象的多个实例。
  • 基于视图的 tableview 使用 mappedObjects 控制器键绑定到 arrayController。
  • 按钮绑定到 tableCellView(排列的对象),使用 keyPath: objectValue.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]);
        }
    }
}

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

希望有帮助

【讨论】:

    【解决方案3】:

    是的,基于视图的表格视图是不同的。 (我自己只是在学习这个。)在基于视图的表格视图中,表格单元视图的 objectValue 是该行表示的对象。您将文本字段、复选框等绑定到该 objectValue 的键路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 2015-12-03
      • 1970-01-01
      • 2013-07-19
      • 2013-06-19
      相关资源
      最近更新 更多