1

我正在制作这个程序,它有一个 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)。我的问题是我无法根据它们的状态来选中和取消选中这些框。我读了这个问题:表格列上的复选框不会注册点击

然后是 NSTableView 数据源参考。根据链接问题中的 Nozzi 先生,在我看来,需要一个包含盒子状态的数组,所以我尝试了,将其设置[cell state]为 NSNumber 以将其放入 NSMutableArray。我 FUBAR'd 那和不认为那是正确的。此表中有 454 行(标记转到 453,因为数组从 0 开始),用于所有四列。

我还想知道是否应该将 tableview:setObjectValue: 中的单元格定义内容放入“awakeFromNib”中。我确实在 IB 中放置了一个复选框按钮单元格,但我之前遇到了问题,所以我决定也以编程方式进行。在所有这些过程中,我确实并且仍然[myTableVeew reloadData]在 setObjectValue 方法中有一个。

感谢您的帮助,如果需要任何其他信息,我可以得到它。

4

1 回答 1

4

您有两个问题:您的数据源不断被吹走,并且您没有正确使用 ... objectValue ... 方法。

数据源: 您在 -numberOfRowsInTableView: 方法中删除了数据源,并在每次表需要刷新时替换它。仅在需要时(例如在应用程序启动时)才需要缓存(可变副本)字典,然后仅从表数据源方法中引用它。也许您应该将其移至实例变量并使用适当的访问器。

此外,文档中提到,由于数据源方法被非常频繁地调用,它们应该很快,因此仅从性能角度来看,这不是一个好主意。您应该只回答委托方法提出的问题,以使表对大型数据集保持响应。

对象值:您应该只从该方法返回对象值(通常是一个 NSNumber 对象,其中包含复选框要切换的状态。

您应该在加载视图或启动应用程序时设置表格列的 -dataCell。更简单:将复选框单元格拖到 Interface Builder 中的表格列中,将其设置为没有代码的数据单元格。

额外注意事项:如果您打算以任何方式保留对此信息的更改,请注意,您绝不能依赖于应用程序包是可写的,也不应尝试覆盖您从包中加载的资源文件。您需要将信息保存在别处,将捆绑副本用作模板副本。

于 2011-02-01T18:37:22.267 回答