我正在制作这个程序,它有一个带有四列的NSTableView,其中两列是复选框。我现在只想让一个人工作而且我已经卡住了 首先,这是我的相关代码:
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView {
NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"];
NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree];
self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization
propertyListFromData:myDataThree
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:NULL
errorDescription:NULL];
return [[flozzCodeAndName objectForKey:@"name"] count];
}
- (void)tableView:(NSTableView *)tableView
setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)rowIndex
{
NSButtonCell *cell;
cell = [[NSButtonCell alloc] init];
[cell setButtonType:NSSwitchButton];
[cell setTitle:@""];
[cell setTag:rowIndex];
NSLog(@"%d", [cell tag]);
[cell setCellAttribute:NSCellEditable to:3];
[cell setImagePosition:NSImageOnly];
[cell setState:NSOnState];
NSLog(@"%d", [cell state]);
[havzColumn setDataCell:cell];
[myTableVeew reloadData];
[cell release];
}
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex {
NSString *filePathThree = [[NSBundle mainBundle] pathForResource:@"mydictionary" ofType:@"plist"];
NSData *myDataThree = [[NSData alloc]initWithContentsOfFile:filePathThree];
self.flozzCodeAndName = (NSMutableDictionary *)[NSPropertyListSerialization
propertyListFromData:myDataThree
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:NULL
errorDescription:NULL];
NSArray *myArray = [flozzCodeAndName objectForKey:[aTableColumn identifier]];
NSString *myStringValue = [myArray objectAtIndex:rowIndex];
return myStringValue;
}
正如您所看到的,我正在使用此表的数据源方法而不是绑定。我为Cocoa阅读的书中有一些带有标签的复选框,但我认为它们是一个数组,所以这可能不是最好的事情。
无论如何,当我运行它时,调试器将向我显示标签(等于行)以及按钮的状态(因为NSOnState,所有这些都是1)。我的问题是,根据他们的状态,我无法检查和取消选中框。我读到了这个问题:Checkbox on table column won't register click
然后是NSTableView数据源参考。根据链接问题中的Nozzi先生的说法,在我看来,需要一个包含盒子状态的数组,所以我尝试了,将[cell state]
设置为NSNumber以使其进入NSMutableArray。我很满意,不认为那是对的。对于所有四列,此表中有454行(由于数组从0开始,标记转到453)。
我也想知道是否应该将tableview中的单元定义内容:setObjectValue:放入'awakeFromNib'中。我确实在IB中放了一个复选框按钮单元,但我之前遇到了问题,所以我决定以编程方式进行。在所有这些过程中,我做了,现在仍然在setObjectValue方法中有[myTableVeew reloadData]
。
我们非常感谢您的帮助,如果需要任何其他信息,我可以得到它。
答案 0 :(得分:4)
您有两个问题:您的数据源一直在被吹走,而您没有正确使用... objectValue ...方法。
数据来源: 您正在-numberOfRowsInTableView:方法中删除数据源,并在每次表需要刷新时替换它。您只想在需要时(比如在应用程序启动时)缓存(可变副本)您的字典,然后只从表数据源方法中引用它。也许您应该将其移动到实例变量并使用适当的访问器。
此外,文档提到,因为数据源方法被频繁调用,所以它们应该很快,所以从性能角度来看,这不是一个好主意。您应该只做一些事情来回答委托方法提出的问题,以保持表对大数据集的响应。
对象值:您应该只返回此方法的对象值(通常是一个NSNumber对象,其中包含复选框要切换的状态。
您应该在加载视图或启动应用程序时设置表列的-dataCell。更简单:将复选框单元格拖到Interface Builder的表格列中,将其设置为没有代码的数据单元格。
其他观察:如果您打算以任何方式保留对此信息的更改,请注意必须依赖依赖应用程序包可写,不应尝试覆盖您从捆绑包中加载的资源文件。您需要将信息保存在其他地方,将捆绑副本用作模板副本 。