【问题标题】:Populate NSTableView with unknown number of columns用未知数量的列填充 NSTableView
【发布时间】:2013-01-17 17:01:52
【问题描述】:

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

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

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

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

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

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

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

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

编辑: 根据要求提供其他信息:

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

【问题讨论】:

  • 表格视图是规则的,所有行的列数必须相同。
  • 谢谢,所有行的列数都相同。但我不知道有多少,因为用户可以添加他想要的数量。所以我无法在不知道它将拥有的元素数量的情况下创建模型......
  • 好问题,如果表视图可能具有的最小/最大列数之间的差异非常小,您可以考虑创建多个视图,每个视图包含不同的表视图(取决于列数),并在需要更改列数时交换视图。
  • 不幸的是,它可以是 2 到 40 列之间的任何内容...
  • 不应该仅仅因为您更改了他们想要显示的列而强制用户重新启动应用程序。 (事实上​​,如果我尝试了一个应用程序,它很快就会进入垃圾箱)。您可以轻松地动态添加或删除表格列,然后调用[tableView reloadData] 以正确填写新列。但这将有助于更多地了解不同列的用途。

标签: objective-c xcode cocoa nstableview


【解决方案1】:

您可以使用addTableColumn: 以编程方式添加列。此方法采用您可以在代码中创建的 NSTableColumn 实例。

架构的其余部分(显示图像等)不会因为列是动态添加的而与“正常”代码发生特别变化。

这是一个可以帮助您入门的 sn-p:

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

【讨论】:

  • 谢谢,但那部分已经完成了!我的问题是填充表格!
  • @user2035269 - 抱歉,但这与填充使用 Interface Builder 创建的普通表有何不同?
  • 这就是问题.. :) 如果我不知道有多少列,我该如何设置模型?我不知道如何像上面描述的那样填满表格..如果它会那么容易,那么我可能会有反对票和答案.. :) 但我是一个初学者,也许我只是没有正确解释自己..任何帮助表示赞赏!谢谢
  • @user2035269 啊,我明白了。只需使用NSDictionary's(或可变的)并通过字符串标识每一列作为键。使用与表视图中的列标识符相同的字符串。但这更多地是表视图的动态数据结构的问题。也许你应该发布一个新问题?
  • 不,不想发布新问题,因为这仍然没有答案。谢谢你的建议!您能否将其发布为答案,以便我可以接受它,如果它有效吗?如果可能的话,举个小例子会更好!
【解决方案2】:

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

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

只需查看NSTableViewDataSourceNSTableViewDelegate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多