2011-01-05 10 views
25

Robię to NSTableView programowo, ale z jakiegoś powodu nie ważne co robię, nie mogę sprawić, że cera headerView pokazać. Konieczne jest, aby zrobić to programowo i nie używać IB, ponieważ faktycznie rozwijam ten widget w IDE o nazwie clzure cl, który jest seplenieniem, który zawiera most kakaowy. Początkowo myślałem, że ten problem mógł być spowodowany przez moje środowisko programistyczne, ale właśnie stworzyłem przykład w Xcode używając tylko celu C i wygląda na to, że problem nadal występuje. Co mogę zrobić, to całkiem proste:Programowe tworzenie NSTableView (kłopoty z NSHeaderView aby pokazać się) (OSX kakao)

zrobię okno w IB i jego metod awkefromnib tworzę i konfiguracja stół-view oto kod:

- (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]; 
} 

Oto kod na przetwarzanie moich danych przedmiotem źródło:

- (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"; 
} 

z tym kodem ja się okno z dwoma colums i czterech rzędach, a każda komórka wyświetlając napis „OK”, to wszystko jest w porządku i dobre, z wyjątkiem tabeli ma nagłówek. Może to mieć sens, z wyjątkiem sytuacji, gdy przyjrzymy się metodzie nagłówkowej tabel, ma ona zainicjowany nagłówek z ramką, której wartości mają sens. Zastanawiam się tylko, dlaczego go nie widzę. Czy jest jakiś specjalny rodzaj magii, który muszę zrobić, żeby nagłówek się wyświetlił? Nie mogę znaleźć żadnych wskazówek w dokumentacji. Ponownie konieczne jest, aby programista działał w ten sposób, więc nie byłoby to pomocne, nie sugerując używania IB, o którym wiem, że będzie miał działającą funkcję headerView. Wielkie dzięki.

Odpowiedz

54

Oto kod programowo utworzyć widok tabeli z paska przewijania i wielu kolumnach.

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

Po prostu myślałem, że opublikuję to dla każdego, kto wciąż szuka prostej odpowiedzi. :)

+0

Dziękujemy! Miałem widok tabeli XIB, który odmówił pobierania komórek i nie oczekiwał tłumaczenia tego na kod ręcznie. <3 – Kalle

+2

Tylko notatkę. Osadzanie widoku tabeli w widoku przewijania jest niezbędne do prawidłowego wyświetlania wszystkiego, łącznie z nagłówkami. – Eonil

+0

Dodano szybką konwersję poniżej –

7

Dobrze odpowiedziałeś na moje własne pytanie, a ja myślałem, że to może być pomocne dla kogoś innego, wydaje się, że że headerView pokaże tylko jeśli dodać tableview do Scrollview.

+1

Myślę, że mogę odpowiedzieć na to pytanie: 'NSTableHeaderView' jest zupełnie odmienny pogląd (a klasa). To tylko IB automatycznie rzuca to na ciebie, jeśli przeciągasz zestaw NSTableView. Myślę, że IB powinno być bardziej jasne co do poglądów przychodzących z takimi "zestawami widoków". – 11684

15

Napisałem ten Swift wersję odpowiedzi @Alex Nicholsa:

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) 

to działało.

+0

, która wymaga niewielkich zmian dla najnowszej wersji, ale działa! –

Powiązane problemy