Программно создавая NSTableView (проблема с появлением NSHeaderView) (cocoa osx)
Я делаю NSTableView программным способом, но по какой-то причине, независимо от того, что я делаю, я не могу заставить darn headerView отображаться. Крайне важно, чтобы я делал это программно и не использовал IB, потому что я действительно разрабатываю этот виджет в среде IDE, называемой clozure cl, которая представляет собой идеал lisp, который включает мост cocoa. Первоначально я думал, что эта проблема, возможно, была вызвана моей разработкой, но я просто создал пример в Xcode, используя только объектив C, и кажется, что проблема сохраняется. То, что я делаю, довольно просто:
Я создаю окно в IB и в его методах awkefromnib, которые я создаю и настраиваю табличный вид, вот код:
- (void)awakeFromNib {
mydatasource *data = [[mydatasource alloc] init];
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"id"];
NSTableView *table = [[NSTableView alloc] initWithFrame: [[self
contentView]frame]];
[table setDataSource:data];
[table addTableColumn:column];
[table addTableColumn:column];
[[self contentView] addSubview:table];
}
Вот код для моего объекта источника данных:
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
printf("NUM ROwS");
return 4;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
printf("THE OTHER ONE");
return @"OKAY";
}
С помощью этого кода я получаю окно с двумя столбцами и четырьмя строками, а каждая ячейка отображает строку "OKAY", все это прекрасно и хорошо, за исключением того, что в таблице нет заголовка. Это может иметь смысл, за исключением случаев, когда я смотрю на метод заголовков таблиц, он имеет инициализированный заголовок с фреймом, значения которого имеют смысл. Мне просто интересно, почему я этого не вижу. Есть ли какой-то особый вид магии, который мне нужно сделать, чтобы заголовок отображался? Я не могу найти никаких подсказок в документации. Еще раз настоятельно необходимо, чтобы это было сделано программно, поэтому было бы нецелесообразно предлагать использовать IB, который, как я знаю, будет иметь рабочий заголовок. Большое спасибо.
Ответы
Ответ 1
Вот некоторый код для программного создания табличного представления со строкой прокрутки и несколькими столбцами.
// create a table view and a scroll view
NSScrollView * tableContainer = [[NSScrollView alloc] initWithFrame:NSMakeRect(10, 10, 380, 200)];
NSTableView * tableView = [[NSTableView alloc] initWithFrame:NSMakeRect(0, 0, 364, 200)];
// create columns for our table
NSTableColumn * column1 = [[NSTableColumn alloc] initWithIdentifier:@"Col1"];
NSTableColumn * column2 = [[NSTableColumn alloc] initWithIdentifier:@"Col2"];
[column1 setWidth:252];
[column2 setWidth:198];
// generally you want to add at least one column to the table view.
[tableView addTableColumn:column1];
[tableView addTableColumn:column2];
[tableView setDelegate:self];
[tableView setDataSource:self];
[tableView reloadData];
// embed the table view in the scroll view, and add the scroll view
// to our window.
[tableContainer setDocumentView:tableView];
[tableContainer setHasVerticalScroller:YES];
[[self contentView] addSubview:tableContainer];
[tableContainer release];
[tableView release];
[column1 release];
[column2 release];
Просто подумал, что я отправлю это для тех, кто все еще ищет прямой ответ.:)
Ответ 2
Я написал эту версию Swift версии @Alex Nichol:
let tableContainer = NSScrollView(frame:NSMakeRect(10, 10, 380, 200))
let tableView = NSTableView(frame:NSMakeRect(0, 0, 364, 200))
let column1 = NSTableColumn(identifier: "Col1")
let column2 = NSTableColumn(identifier: "Col2")
column1.width = 252
column2.width = 198
tableView.addTableColumn(column1)
tableView.addTableColumn(column2)
tableView.setDelegate(self)
tableView.setDataSource(self)
tableView.reloadData()
tableContainer.documentView = tableView
tableContainer.hasVerticalScroller = true
window.contentView.addSubview(tableContainer)
Это сработало.
Ответ 3
Хорошо, я ответил на свой вопрос, и я подумал, что это может быть полезно кому-то другому, кажется, что заголовок будет отображаться только в том случае, если вы добавите представление таблицы в прокрутку.