Creando programáticamente un NSTableView (problemas para que aparezca el NSHeaderView) (cocoa osx)


Estoy haciendo un NSTableView programáticamente pero por alguna razón no importa lo que haga, no puedo hacer que aparezca el maldito headerView. Es imperativo que lo haga programáticamente y no use el IB porque en realidad estoy desarrollando este widget en un IDE llamado clozure cl que es un ide lisp que incluye un cocoa bridge. Originalmente pensé que este problema podría haber sido causado por mi entorno de desarrollo, pero acabo de crear un ejemplo en Xcode usando solo objective C y parece que el problema persiste. Lo que hago es bastante sencillo:

Hago una ventana en el IB y en sus métodos awkefromnib creo y configuro una vista de tabla 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];
}

Aquí está el código para mi objeto de origen de datos:

- (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 obtengo una ventana con dos columnas y cuatro filas y cada celda muestra la cadena "OKAY", todo esto está bien, excepto que la tabla no tiene encabezado. 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 necesito 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 ide lisp que esto se haga programáticamente, por lo que no sería útil no sugerir el uso del IB que sé que tendrá un headerView de trabajo. Muchas gracias.

Author: Leo Dabus, 2011-01-05

3 answers

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

Solo pensé que publicaría esto para cualquiera que aún busque una respuesta directa. :)

 56
Author: Alex Nichol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-04 19:16:59

Escribí esta versión Rápida 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ó.

 16
Author: Bjorn Tipling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-02 19:10:38

Bueno, respondí a mi propia pregunta y pensé que esto podría ser útil para alguien más, parece que el headerView solo se mostrará si agrega el tableview a un scrollview.

 7
Author: Mike2012,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-05 00:29:23