使用未知列数填充NSTableView

8
我有一个NSTableView和一个按钮。NSTableview有未知数量的列。
第一列有一个图像井和2个文本框,其余(再次是未知数量)都是正常的文本框列。
该按钮打开文件打开对话框。 一旦我选择了要处理的文件(.jpg),我会希望处理它们。
到目前为止,所有内容都已准备就绪(选择文件、列等),缺少的是填充表格:
我已经用循环遍历了所有选定的文件。 最佳方法是什么:
- 在第一个单元格的图像井中显示图像, - 在第一个单元格的第一个文本框中键入文件名, - 在文本框的第二个单元格中输入文件路径, - 在所有其他列中键入"YES"。
我的困难在于我不知道有多少列,因为这取决于用户。 列数将在运行时不改变。 它们在启动时根据配置设置。 如果更改配置,则应重新加载应用程序。
我是Objective-C / Cocoa编程的初学者。
编辑:按要求提供的其他信息:
这是基于视图的NSTableView,每一列代表稍后对图像要执行的操作。程序用户可以决定要采取什么样的操作以及多少个操作,这就是表格视图中列的数量未知的原因。

表视图是规则的,所有行必须具有相同数量的列。 - Ramy Al Zuhouri
1
谢谢,所有行都有相同数量的列。但是我不知道有多少,因为用户可以添加任意数量...所以我不能在不知道它将拥有的元素数量的情况下创建模型... - sharkyenergy
不错的问题,如果表视图可能具有的最小/最大列数之间的差异非常低,则可以考虑创建多个视图,每个视图包含不同的表视图(取决于列数),并在需要更改列数时交换视图。 - Ramy Al Zuhouri
1
不应该因为更改用户想要显示的列而强制用户重新启动应用程序。(事实上,如果我尝试过这样的应用程序,它很快就会被删除)。您可以轻松地动态添加或删除表格列,然后调用[tableView reloadData]以正确填充新列。但是,了解不同列的目的将有所帮助。 - NSGod
该应用程序利用核心数据,在数据库中的每个条目都有一列。基本上这些图像会在之后进行处理,并且每个图像都应该针对数据库条目进行处理。因此,在第一列中,我有图像信息,在其他列中,我有应该对该图像执行的事项列表(每列一个)。用户可以决定对该图像执行多少操作。 - sharkyenergy
显示剩余3条评论
2个回答

13
您可以使用addTableColumn:以编程方式添加列。此方法接受一个NSTableColumn实例,您可以在代码中创建它。
因为列是动态添加的,所以您的其余架构(显示图像等)不会特别改变“正常”代码。
这里是一个可以帮助您入门的片段:
NSTableColumn* tc          = [[NSTableColumn alloc] init];

NSString *columnIdentifier = @"NewCol"; // Make a distinct one for each column
NSString *columnHeader     = @"New Column"; // Or whatever you want to show the user

[[tc headerCell ] setStringValue: columnHeader];
tc.identifier = columnIdentifier;

// You may need this one, too, to get it to show.
self.dataTableview.headerView.needsDisplay = YES;

在填充表格时,假设模型是一个NSDictionary对象数组(在self.model中),可以按照以下方式进行;

填充表格时,假定模型为NSDictionary对象数组(位于self.model中),可按以下方式进行:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

     NSString *columnIdentifier = tableColumn.identifier;

     NSDictionary *rowDict = [self.model objectAtIndex: row];

     NSString *value = [rowDict valueForKey: columnIdentifier]; // Presuming the value is stored as a string 
     
     // Show the value in the view
}

查看文档中的更多内容。


谢谢,但那部分已经完成了!我的问题是如何填充表格! - sharkyenergy
2
这就是问题所在.. :) 如果我不知道有多少列,我该如何设置模型?我不知道如何像上面描述的那样填充表格.. 如果这很容易,那么我可能会得到负评和答案.. :) 但我是一个初学者,也许我没有恰当地解释自己.. 感谢任何帮助!谢谢 - sharkyenergy
1
不,我不想发布一个新问题,因为这个问题可能会得不到回答。感谢您的建议!您能否将其作为答案发布,以便我可以接受它是否有效?如果可能的话,最好附上一个小例子! - sharkyenergy
请注意,我正在处理图像,因此翻译必须与其兼容。 - sharkyenergy
@user2035269 添加了一些关于如何处理动态模型的内容,但请将这个相当复杂的问题拆分成子问题,例如如何在表视图中显示图像。 - Monolo
显示剩余2条评论

2
当用户添加列或行时,您应该在模型中反映出来(通过绑定或代码),这样当您需要填充表格时,就知道其大小。
设置tableView.delegate(在代码或Interface Builder中),参考此处
实现:
- (NSView*) tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn*)tableColumn row:(NSInteger)row
{ 
    Item* itemView = [tableView makeViewWithIdentifier:@"rowItem" owner:self];

    /*Here you populate your cell view*/
    id entryObject = [self.entries objectAtIndex:row];
    [itemView setEntry:entryObject];

    return itemView;
}

然后调用[tableView reloadData];
也许对你来说最好使用这个方法: - (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex 只需查看NSTableViewDataSourceNSTableViewDelegate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接