我正在尝试学习 cocoa,但在 KVC 和绑定(bind)方面遇到了一些问题。我有一个包含三列的 nstableview; “复选框”、“文本”、“图标”。每列的值都使用 KVC 绑定(bind)到数组 Controller 。当程序启动时,行和列将根据数组中的值正确填充到表格 View 中。我可以单击一行并使用如下内容正确打印该行的内容:
- (IBAction)fileTableViewSelected:(id)sender{
NSInteger r;
NSDate *fModOne;
id object;
r = [[NSNumber numberWithInt:[sender selectedRow]] intValue];
object = [arrayIntersect objectAtIndex:r];
fModOne = [object valueForKey:@"fileModifiedDirOne"];
NSLog(@"Date found in row is %@",fModOne);
}
我的问题是当我尝试单击第一列中的复选框并更改该框的值时。最初,使用 arraycontroller 将复选框的值设置为 1,效果很好,但是当我想通过单击特定行的复选框将其值更改为 0 时,程序崩溃了。单击该框时,会正确调用一个操作,这就是我认为可以通过调用简单地更改对象 BOOL 值的地方:
[object setValue:[NSNumber numberWithBool:NO] forKey:@"doSync"];
我的 BOOL doSync 的 setter 和 getter 定义为:
@property(nonatomic, readwrite) BOOL doSync;
@dynamic doSync;
- (void)setDoSync:(BOOL) value{
NSLog(@"setting dosync %i", value);
doSync = NO;
}
- (BOOL)doSync{
return doSync;
}
我到处搜索问题的解决方案,但我找不到任何有关如何使用 KVC 和绑定(bind)在 tableview 中使用复选框的示例。我很感激我能在这方面获得的任何帮助,并且我会很感激任何我可以看一下的例子。 干杯和感谢!特隆德
最佳答案
您不需要自己将其作为操作来实现。只需通过数组 Controller 的 arrangedObjects
将列绑定(bind)到模型对象的 doSync
属性即可。
如果您不想使用绑定(bind),您仍然不应该将其实现为操作。相反,作为 TableView 的数据源并响应 TableView 将发送给您以更改其中一个值的消息。
@dynamic doSync;
如果您转身并在同一个类中实现该属性的访问器,则没有理由这样做。
如果这是一个托管对象类并且该属性是实体的属性,则 your accessors should send [self willAccessValueforKey:]
before and [self didAccessValueForKey:]
after accessing the instance variable 。如果这就是他们所做的全部,那么您根本不应该实现自定义访问器;将它们剪掉并单独使用 @dynamic
。
- (void)setDoSync:(BOOL) value{ doSync = NO;
这并不是将属性设置为传入的值。
关于objective-c - 如何单击 nstableview 中的复选框并使用 KVC 更新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742441/