2011-01-05 14 views
25

Estoy haciendo un NSTableView programáticamente pero por alguna razón no importa lo que haga, no puedo hacer aparecer el maldito headerView. Es imperativo que haga esto programáticamente y no use el IB porque en realidad estoy desarrollando este widget en un IDE llamado clozure cl, que es un lisp ide que incluye un puente de cacao. Originalmente pensé que este problema podría haber sido causado por mi entorno de desarrollo, pero acabo de crear un ejemplo en Xcode utilizando solo el objetivo C y parece que el problema persiste. Lo que hago es bastante sencillo:Creación programática de un NSTableView (problemas para mostrar el NSHeaderView) (cocoa osx)

hago una ventana en el IB y en sus métodos awkefromnib puedo crear y configurar una tabla de vista aquí está el código:

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

Este es el código para mis datos objeto de origen:

- (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 este código me sale una ventana con dos columnas y cuatro filas y cada célula que muestra la cadena "bien", esto es todo bien y bueno, excepto la mesa no tiene cabecera. Esto podría tener sentido, excepto cuando miro el método de encabezado de tablas, tiene un encabezado inicializado con un marco cuyos valores tienen sentido. Me pregunto por qué no lo veo. ¿Hay algún tipo especial de magia que deba hacer para que se muestre el encabezado? Parece que no puedo encontrar ninguna pista en la documentación. Una vez más, es imperativo para el ceceo que esto se haga de forma programática, por lo que no sería útil no sugerir usar el IB, que sé que tendrá un encabezado de trabajo. Muchas gracias.

Respuesta

54

Aquí hay un código para crear programáticamente una vista de tabla con una barra de desplazamiento y varias columnas.

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

Sólo pensé en publicar esto para cualquiera que todavía esté buscando una respuesta directa. :)

+0

¡Gracias! Tenía una vista de tabla XIB que se negaba a buscar las celdas y no tenía muchas ganas de traducirla en código a mano. <3 – Kalle

+2

Solo una nota. Incrustar la vista de tabla en una vista de desplazamiento es esencial para mostrar todo correctamente, incluidos los encabezados. – Eonil

+0

Agregó una conversión rápida debajo de –

7

Bien, respondí mi propia pregunta y pensé que esto podría ser útil para otra persona, parece que el headerView solo aparecerá si agrega la tabla vista a una vista de desplazamiento.

+1

Creo que puedo responder a su pregunta: 'NSTableHeaderView' es una vista (y clase) completamente diferente. Es solo IB tirarlo automáticamente si arrastras un NSTableView-set. Creo que IB debería ser más claro acerca de qué vistas vienen con tales 'conjuntos de vistas'. – 11684

15

escribí esta versión Swift de la respuesta de @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) 

Funcionó.

+0

requiere cambios menores para la última entrega pero funciona! –

Cuestiones relacionadas