8

我有一个 NSTableview 和一个按钮。NSTableview 的列数未知。

第一列有一个图像井和 2 个文本框,其他的(同样是未知数字)是普通的文本框列。

该按钮打开文件打开对话框。一旦我选择了文件(.jpg),我想处理它们。

到目前为止,一切都已完成(选择文件、列等)。缺少的是表格的填充:

我有遍历所有选定文件的循环。做这个的最好方式是什么:

  • 在第一个单元格的图像井中显示图像,
  • 在第一个单元格的第一个文本框中键入文件名,
  • 在文本框的第二个单元格中键入文件路径,
  • 在所有其他列中键入“YES”。

我的困难是我不知道会有多少列,因为它取决于用户。列数在运行时不会改变。它们是在启动时根据配置设置的。如果更改了配置,则应重新加载应用程序。

我是 Objective-C/Cocoa 编程的初学者。

编辑:根据要求提供附加信息:

它是一个基于视图的 NSTableView,每一列都代表一个稍后必须对图像执行的操作。程序用户可以决定采取什么行动以及采取多少行动,这就是表格视图中列数未知的原因。

4

2 回答 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;

填充表格时,假设模型是一个对象数组(in self.modelNSDictionary,它可以是这样的;

- (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
}

更多在文档中。

于 2013-02-02T16:30:52.097 回答
3

当用户添加列或行时,您应该在模型中反映它(通过绑定或通过代码),以便在需要填充表时知道表的大小。

设置 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

于 2013-02-03T02:31:47.233 回答