Программное создание NSTableView (проблема с отображением NSHeaderView) (Cocoa OSX) - PullRequest
29 голосов
/ 05 января 2011

Я делаю NSTableView программно, но по какой-то причине, независимо от того, что я делаю, я не могу заставить отображаться проклятый headerView. Крайне важно, чтобы я делал это программно, а не использовал IB, потому что я на самом деле разрабатываю этот виджет в IDE с именем clozure cl, который является идеей, который содержит мост какао. Первоначально я думал, что эта проблема могла быть вызвана моей средой разработки, но я только что создал пример в 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";
}

С помощью этого кода я получаю окно с двумя столбцами и четырьмя строками, и в каждой ячейке отображается строка «ОКЕЙ», все это хорошо, за исключением того, что в таблице нет заголовка. Это может иметь смысл, за исключением того, что когда я смотрю на метод заголовка таблицы, он имеет инициализированный заголовок с рамкой, значения которой имеют смысл. Мне просто интересно, почему я этого не вижу. Есть ли какая-то особая магия, которую нужно сделать, чтобы заголовок отображался? Я не могу найти какие-либо подсказки в документации. Еще раз, для lisp ide обязательно, чтобы это было сделано программно, поэтому было бы бесполезно не предлагать использовать IB, который, как я знаю, будет иметь рабочий заголовок. Большое спасибо.

Ответы [ 3 ]

60 голосов
/ 04 июля 2011

Вот некоторый код для программного создания табличного представления с полосой прокрутки и несколькими столбцами.

// 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];

Просто подумал, что я опубликую это для тех, кто все еще ищет прямой ответ. :)

17 голосов
/ 02 января 2015

Я написал эту версию 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)

Все заработало

7 голосов
/ 05 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...