xcode 使用未知的列数填充NSTableView

wpcxdonn  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(153)

我有一个NSTableview和一个按钮。NSTableview的列数未知。
第一列有一个图像井和2个文本框,其他列(同样,未知数)是普通文本框列。
按钮打开一个文件打开对话框。一旦我选择了文件(.jpg),我想处理它们。
到目前为止,一切都已完成(选择文件、列等),缺少的是表的填充:
我有一个遍历所有选定文件的循环。最好的方法是什么:

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

我的困难是,我不知道有多少列将在那里,因为它取决于用户。列的数量不会在运行时改变。他们是在启动时根据配置设置。如果配置被更改,那么应用程序应该重新加载。
我是Objective-C/可可编程的初学者。
编辑:根据要求提供其他信息:
这是一个基于视图的NSTableView,每一列都表示稍后必须对映像执行的操作。程序用户可以决定要执行什么操作以及要执行多少操作,这就是表视图中列数未知的原因。

nom7f22z

nom7f22z1#

您可以使用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中),它可能如下所示;

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

azpvetkf

azpvetkf2#

当用户添加列或行时,您应该在模型中反映它(通过绑定或通过代码),以便在需要填充表时知道表的大小。
set tableView.delegate(在代码或接口生成器中),在此处引用
实施:

- (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
只需查看NSTableViewDataSource和NSTableViewDelegate

相关问题