Objective c 使用未知数量的列填充NSTableView
我有一个NSTableview和一个按钮。NSTableview的列数未知 第一列有一个图像井和两个文本框,其他(同样,未知数字)是普通文本框列 该按钮打开文件打开对话框。一旦我选择了文件(.jpg),我想处理它们 到目前为止,一切都已完成(选择文件、列等)。缺少的是填充表: 我有一个遍历所有选定文件的循环。最好的方法是什么:Objective c 使用未知数量的列填充NSTableView,objective-c,xcode,cocoa,nstableview,Objective C,Xcode,Cocoa,Nstableview,我有一个NSTableview和一个按钮。NSTableview的列数未知 第一列有一个图像井和两个文本框,其他(同样,未知数字)是普通文本框列 该按钮打开文件打开对话框。一旦我选择了文件(.jpg),我想处理它们 到目前为止,一切都已完成(选择文件、列等)。缺少的是填充表: 我有一个遍历所有选定文件的循环。最好的方法是什么: 在第一个单元格的图像井中显示图像 在第一个单元格的第一个文本框中键入文件名 在文本框的第二个单元格中键入文件路径 在所有其他列中键入“是” 我的困难是我不知道有多少列
- 在第一个单元格的图像井中显示图像
- 在第一个单元格的第一个文本框中键入文件名
- 在文本框的第二个单元格中键入文件路径
- 在所有其他列中键入“是”
每一列代表一个动作,该动作必须在稍后的图像上执行。程序用户可以决定要执行的操作和数量,这就是表视图中列数量未知的原因。您可以使用
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
}
更多信息请参见。当用户添加列或行时,您应该在模型中反映它(通过绑定或代码),以便在需要填充时知道表的大小 设置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)一个对象forTableColumn:(NSTableColumn*)aTableColumn行:(NSInteger)行索引
只需查看和表视图是常规的,所有行必须具有相同的列数。谢谢,所有行都具有相同的列数。但是我不知道有多少,因为用户可以添加他想要的数量。。因此,在不知道它所拥有的元素数量的情况下,我无法创建一个模型。好的问题是,如果表视图可能具有的列的最小/最大数量之间的差值非常低,可以考虑创建多个视图,每个视图包含不同的表视图(取决于列的数量),并在需要更改列数时交换视图。不幸的是,它可以是2到40列中的任何列…不必仅仅因为您更改了用户希望显示的列就强制用户重新启动应用程序。(事实上,如果我尝试了一个这样做的应用程序,它很快就会被扔进垃圾桶)。您可以轻松地动态添加或删除表列,然后调用[tableView reloadData]
正确填写新列。但是了解更多不同专栏的目的会有所帮助。谢谢,但这部分已经完成了!我的问题是填充表@user2035269-啊,对不起,但是这与填充用Interface Builder创建的普通表有什么不同呢?这就是问题所在:)如果我不知道有多少列,如何设置模型?我不知道怎样才能像上面所说的那样填满这张桌子。。如果这也一样容易的话,我可能会投反对票,并得到一个答案:)但是我是一个初学者,也许我没有正确地解释我自己。。感谢您的帮助!thanks@user2035269啊,我明白了。只需使用NSDictionary
(或可变的),并用字符串作为键来标识每一列。使用与表视图中的列标识符相同的字符串。但事实证明,这更像是表视图所显示的动态数据结构的问题。也许你应该发布一个新问题?不,不要发布一个新问题,因为这个问题仍然没有答案。谢谢你的建议!你能把它贴出来作为答案吗?这样我可以接受它,如果它有效的话?如果可能的话,举个小例子会更好!