gpt4 book ai didi

objective-c - 获取复选框以在 NSTableColumn 中反射(reflect)其状态

转载 作者:行者123 更新时间:2023-12-03 16:55:42 24 4
gpt4 key购买 nike

我正在制作一个具有四列的 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;
}

如您所见,我对此表使用数据源方法而不是绑定(bind)。我为 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]

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

最佳答案

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

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

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

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

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

其他观察:如果您计划以任何方式保留对此信息的更改,请注意,您绝不能依赖可写的应用程序包,并且永远不应该尝试覆盖资源文件,例如您从 bundle 中加载的资源文件。您需要将信息保存在其他地方,使用捆绑副本作为模板副本。

关于objective-c - 获取复选框以在 NSTableColumn 中反射(reflect)其状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4866423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com