2011-01-05 3 views
25

Sto creando un NSTableView a livello di codice, ma per qualche motivo non importa quello che faccio, non riesco a visualizzare l'intestazione darn. È fondamentale farlo a livello di codice e non utilizzare l'IB perché sto effettivamente sviluppando questo widget in un IDE chiamato clozure cl che è un ide lisp che include un ponte di cacao. Originariamente pensavo che questo problema potesse essere causato dal mio ambiente di sviluppo ma ho appena creato un esempio in Xcode usando solo l'obiettivo C e sembra che il problema persista. Quello che faccio è piuttosto semplice:Creazione di un NSTableView a livello di codice (impossibile visualizzare NSHeaderView) (cacao osx)

faccio una finestra nella IB e nei suoi metodi awkefromnib creo e la configurazione di un tavolo con vista qui è il codice:

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

Ecco il codice per il mio dati oggetto sorgente:

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

con questo codice ottengo una finestra con due colonne e quattro righe e ciascuna cella che visualizza la stringa "okay", questo è tutto bene e buona tranne il tavolo ha alcuna intestazione. Questo potrebbe avere senso tranne quando guardo il metodo di intestazione delle tabelle, ha un'intestazione inizializzata con un frame i cui valori hanno un senso. Mi sto solo chiedendo perché non lo vedo. C'è qualche tipo speciale di magia che devo fare in modo che l'intestazione venga visualizzata? Non riesco a trovare alcun indizio nella documentazione. Ancora una volta è imperativo per l'ide lisp che questo sia fatto a livello di programmazione quindi non sarebbe utile non suggerire l'utilizzo dell'IB che so avrà un headerView funzionante. Molte grazie.

risposta

54

Ecco un codice per creare a livello di codice una vista tabella con una barra di scorrimento e più colonne.

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

solo pensato che avrei pubblicare questo per chi ancora alla ricerca di una risposta dritto in avanti. :)

+0

Grazie! Avevo una vista tabella XIB che si rifiutava di recuperare le celle e non vedeva l'ora di tradurle in codice a mano. <3 – Kalle

+2

Solo una nota. L'incorporamento della vista tabella in una vista a scorrimento è essenziale per visualizzare tutto correttamente comprese le intestazioni. – Eonil

+0

Aggiunto una conversione rapida sotto –

7

Bene, ho risposto alla mia domanda e ho pensato che questo potrebbe essere utile a qualcun altro, sembra che l'headerView verrà visualizzato solo se si aggiunge il tableview a una scrollview.

+1

Penso di poter rispondere alla tua domanda: 'NSTableHeaderView' è una vista completamente diversa (e classe). È solo che IB ti lancia automaticamente contro di te se togli un set NSTableView. Penso che IB dovrebbe essere più chiaro riguardo a quali visualizzazioni vengono fornite con tali "view set". – 11684

15

Ho scritto questa versione Swift della risposta di @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) 

Ha funzionato.

+0

richiede modifiche minori per l'ultimo swift ma funziona! –