我有一个NSTableview和一个按钮。 NSTableview的列数未知。
第一列有一个图像井和2个文本框,其他(再次,未知数字)是普通的文本框列。
按钮打开文件打开对话框。一旦我选择文件(.jpg),我想处理它们。
到目前为止,所有内容都已完成(选择了文件,列等)。缺少的是填充表格:
我有循环遍历所有选定的文件。最好的方法是:
我的困难在于我不知道会有多少列,因为它取决于用户。在运行时期间,列数不会更改。它们是在启动时根据配置设置的。如果配置已更改,则应重新加载应用程序。
我是Objective-C / Cocoa编程的初学者。
编辑: 根据要求提供的其他信息:
这是一个基于NSTableView的视图 每列表示必须在稍后的图像上拍摄的动作。程序用户可以决定要采取的操作数量和数量,这就是表视图中未知数量的列的原因。
答案 0 :(得分:11)
您可以使用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;
填充表时,假设模型是self.model
个NSDictionary
个对象的数组,它可能会像这样;
- (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
}
docs中的更多内容。
答案 1 :(得分:3)
当用户添加列或行时,您应该在模型中反映它(通过绑定或代码),以便在需要填充表时知道表的大小。
设置tableView.delegate(在代码或Interface Builder中),引用here
实现:
- (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