Подтвердить что ты не робот

Программно создавая 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, который, как я знаю, будет иметь рабочий заголовок. Большое спасибо.

4b9b3361

Ответ 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

Хорошо, я ответил на свой вопрос, и я подумал, что это может быть полезно кому-то другому, кажется, что заголовок будет отображаться только в том случае, если вы добавите представление таблицы в прокрутку.