Création par programmation d'un NSTableView (difficulté à faire apparaître le NSHeaderView) (cocoa osx)

Je fais un NSTableView par programme mais pour une raison quelconque, peu importe ce que je fais, Je ne peux pas faire apparaître le darn headerView. Il est impératif que je le fasse par programme et ne pas utiliser L'IB parce que je développe réellement ce widget dans un IDE appelé clozure cl qui est un ide lisp qui inclut un pont cocoa. A l'origine je pensais que ce problème aurait pu être causé par mon environnement de développement mais je viens de créer un exemple dans Xcode en utilisant uniquement objective C et il semble que le problème persiste. Ce que je fais est assez simple:

Je fais une fenêtre dans L'IB et dans ses méthodes awkefromnib je crée et configure une vue de table voici le code:

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

Voici le code de mon objet source de données:

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

Avec ce code, j'obtiens une fenêtre avec deux colonnes et quatre lignes et chaque cellule affichant la chaîne "OK", tout cela est bien et bien sauf que la table n'a pas d'en-tête. Cela peut avoir du sens, sauf quand je regarde la méthode d'en-tête des tables, il a un en-tête initialisé avec un cadre dont les valeurs ont du sens. Je me demande juste pourquoi je ne le vois pas. Y a-t-il un type spécial de magie dont j'ai besoin pour que l'en-tête s'affiche? Je n'arrive pas à trouver d'indices dans la documentation. Encore une fois, il est impératif pour l'ide lisp que cela soit fait par programme, donc il ne serait pas utile de suggérer d'utiliser L'IB qui, je le sais, aura un headerView fonctionnel. Mille mercis.

26
demandé sur Leo Dabus 2011-01-05 03:11:47

3 réponses

Voici du code pour créer par programmation une vue de table avec une barre de défilement et plusieurs colonnes.

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

J'ai juste pensé que je publierais ceci pour tous ceux qui cherchent encore une réponse simple. :)

56
répondu Alex Nichol 2011-07-04 19:16:59

J'ai écrit cette version rapide de la réponse 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)

Ça a marché.

16
répondu Bjorn Tipling 2015-01-02 19:10:38

Eh bien, j'ai répondu à ma propre question et j'ai pensé que cela pourrait être utile à quelqu'un d'autre, il semble que le headerView n'apparaîtra que si vous ajoutez le tableview à un scrollview.

7
répondu Mike2012 2011-01-05 00:29:23