Cocoa 将复选框绑定到共享用户默认值
我正在构建一个表,以便在首选项窗格中显示一些数据。所有数据都保存在NSUserDefaults中。表中有一个复选框,用于启用/禁用所列设备的数据。复选框是唯一可编辑的单元格 该表正确显示了共享用户默认值中的数据。因此,我知道我已将表内容正确映射到正确的共享用户默认模型密钥路径。但是,当我切换复选框时,新数据根本不会写入默认值 这里是一个在复选框设置一瞥 我曾尝试将选择器操作分配给NSButton(复选框),认为可以通过编程方式设置默认值。奇怪的是,这个动作从未被触发。我设置了一个简单的操作,只做了一个NSLog。单击复选框时,它从未被触发 更新:为了查看我的默认数据结构,这里是defaults命令的输出。这张表后面实际上没有任何代码Cocoa 将复选框绑定到共享用户默认值,cocoa,cocoa-bindings,Cocoa,Cocoa Bindings,我正在构建一个表,以便在首选项窗格中显示一些数据。所有数据都保存在NSUserDefaults中。表中有一个复选框,用于启用/禁用所列设备的数据。复选框是唯一可编辑的单元格 该表正确显示了共享用户默认值中的数据。因此,我知道我已将表内容正确映射到正确的共享用户默认模型密钥路径。但是,当我切换复选框时,新数据根本不会写入默认值 这里是一个在复选框设置一瞥 我曾尝试将选择器操作分配给NSButton(复选框),认为可以通过编程方式设置默认值。奇怪的是,这个动作从未被触发。我设置了一个简单的操作,只
{
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”。