2013-04-10 76 views
3

我正在构建一个表,以在我的偏好设置面板中显示一些数据。所有的数据都在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:在这一点上,我会接受的只是能够从复选框调用一个选择的解决方案。

+0

目前还不清楚在什么水平你已经绑定的实现代码如下单元视图中的数据,但它可能需要另一个层次高? ClimateDeviceData.display? – 2013-04-11 17:50:27

+0

表视图绑定到共享用户默认值控制器,并且模型关键路径已被设置为'ClimateDeviceData'。 – 2013-04-11 18:09:18

回答

1

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

+0

我尝试了很长一段时间,甚至永远无法获得要显示的数据。尽管我将表视图绑定到共享用户默认值控制器。 – 2013-04-11 03:24:39

0

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

1

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

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

  • 我在XIB中使用了一个arrayController,在我的代码中引用了一个可变数组,它存储了具有状态属性(boolean)的自定义对象的几个实例。
  • 基于视图的tableview通过使用arrangedObjects控制器键绑定到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]; 
    } 

我关于该对象的“状态”的keyPath添加观察者。我添加待处理的代码,观察对象是否发生值更改:

- (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]); 
     } 
    } 
} 

一旦进入方法,您可以执行所需操作。它肯定会被调用,并且会得到与您单击的行,更改字典和键路径匹配的对象。

希望帮助