Question

Ce qui est un moyen facile de configurer mon NSTableView avec plusieurs colonnes pour afficher uniquement certaines données dans une colonne. Je les IBOutlets mis en place, mais je ne sais pas où aller à partir de là.

Était-ce utile?

La solution

En supposant que vous ne l'utilisez Cocoa Manchettes / Core Data, vous pouvez afficher les données dans un NSTableView en mettant en œuvre deux méthodes de la protocole de NSTableViewDataSource. En règle générale votre contrôleur mettra en œuvre le protocole, afin d'ouvrir le fichier .m du contrôleur et ajouter ces méthodes au @implementation du contrôleur:

- (NSInteger)numberOfRowsInTableView:(NSTableView*)tableView {
  return 25;  // fill this out
}

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  return row % 3 ? @"Tick..." : @"BOOM!";  // fill this out
}

Vous devez définir au contrôleur propriété dataSource de la table. Dans Interface Builder contrôle-glisser de la vue de la table au contrôleur et codez dataSource. Maintenant, construire et exécuter et vous devriez voir vos données dans le tableau.

Si vous voulez seulement remplir une colonne, ajoutez une IBOutlet NSTableColumn * à votre contrôleur; appelons-le explosiveColumn. Dans Interface Builder, le contrôle glisser du contrôleur à la colonne que vous souhaitez remplir et mettre explosiveColumn. Puis, en tableView: objectValueForTableColumn: ligne: vous pouvez tester si le paramètre column est le même objet que celui que la sortie est réglée sur:

– (id) tableView:(NSTableView*)tableView
       objectValueForTableColumn:(NSTableColumn*)column
       row:(int)row {
  if (column == explosiveColumn) {
    return row % 3 ? @"Tick..." : @"BOOM!";
  } else {
    // other columns blank for now
    return nil;
  }
}

Ce tutoriel peut être utile: http://www.cocoadev.com/index.pl? NSTableViewTutorial

Autres conseils

Voici un exemple en utilisant plusieurs vues de table avec des méthodes de source de données et une application document:

#pragma mark - Data Source Methods
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tv
{
    if (tv == racerTableView)
        return [racerList count];
    else if (tv == vehicleTableView)
        return [vehicleList count];
    else
        return 0; // something wrong here...
}

- (id)tableView:(NSTableView *)tv objectValueForTableColumn:(NSTableColumn *)col
        row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView){
        NHRacers *racer = [racerList objectAtIndex:rowi];
        return [racer valueForKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        return [vehicle valueForKey:colid];
    }
    else
        return 0; // something wrong here...
}

- (void)tableView:(NSTableView *)tv setObjectValue:(id)obj forTableColumn:(NSTableColumn *)col row:(NSInteger)rowi
{
    NSString *colid = [col identifier];
    if (tv == racerTableView) {
        NHRacers *racer = [racerList objectAtIndex:rowi];
        [racer setValue:obj forKey:colid];
    }
    else if (tv == vehicleTableView){
        NHVehicles *vehicle = [vehicleList objectAtIndex:rowi];
        [vehicle setValue:obj forKey:colid];
    }
    else
        nil; // something wrong here...    
    [self updateChangeCount:NSChangeDone];
}

Les tableview sorties de DataSource sont fixés pour définir vehicleTableView et racerTableView à leur « Tableau » respectif propriétaire et le propriétaire du fichier du fichier a dans l'IB. Les contrôles clés colid l'identificateur (défini dans IB en sélectionnant la colonne d'affichage du tableau sous la rubrique « identité » déroulant, tandis que le « Identité inspecteur » est affiché). Ces valeurs ont été choisies pour être le KVC (clé de codage conforme) propriétés des classes en cours d'affichage dans les vues de table:. Utiliser les minuscules première lettre (voir docs de pomme pour le repos)

Par exemple: (En NHVehicles.h)

@interface NHVehicles : NSObject
{
    NSUInteger entry;
    NSString *name;
    NSString *vehicleClass;
}
@property NSUInteger entry;
@property NSString *name, *vehicleClass;
@end

(en NHVehicles.m)

@implementation NHVehicles
@synthesize entry, name, vehicleClass;
@end

pour ce tableView, "entrée", "name" et "vehicleClass" sera tapé (w / o « ) dans les champs identificateurs de leurs colonnes respectives.

Si vous ne souhaitez pas afficher des données dans la classe, il suffit de ne pas entrer la clé pour l'identificateur de colonne. Une mise en garde: J'utilise Xcode 4.5.1 et j'ai remarqué qu'une fois que j'étais entré quelques clés pour une identification de colonne particulière, puis a changé d'avis au sujet et a tenté d'effacer le texte, il se plaignait quand je supprimé le texte de la champ d'identification (je ne pouvais plus laisser le champ vide pour les colonnes que j'avais édité). Ce ne fut pas difficile à contourner, mais ce fut une surprise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top