2010-08-03 7 views
7

Cela fait deux jours que j'essaie de le faire et que je cours constamment dans des impasses. J'ai étudié la programmation Cocoa d'Aaron Hillegass pour MAC OS X et j'ai fait tous les exercices pertinents sur NSTableview et les tableaux mutables, et j'ai essayé de les modifier pour répondre à mes besoins.Remplissage de NSTableview à partir d'un tableau mutable

Cependant, aucun d'entre eux ne semble utiliser un tableau avec des objets comme source de données, il semble utiliser la tableview comme source de données. Je suis en train de mettre en œuvre le "retravaillé" de Jonas Jongejan de mon code here, avec un frontal Cocoa pour afficher les résultats.

N'importe quel pointeur ou suggestion Je sais que cela devrait être simple, mais je suis perdu dans le désert ici.

je peux remplir la table en définissant le tableau

Répondre

14

Il est assez simple en fait, une fois que vous arrivez à le comprendre (bien sûr!). Vous ne pouvez pas utiliser un NSArray directement en tant que source de table. Vous devez soit créer un objet personnalisé qui implémente NSTableViewDataSource ou implémenter ce protocole dans une classe existante - généralement un contrôleur. Si vous utilisez Xcode pour créer une application basée sur un document standard, la classe de contrôleur de document - (elle s'appellera MyDocument) est une bonne classe à utiliser.

Vous devez mettre en œuvre au moins ces deux méthodes:

– numberOfRowsInTableView: 
– tableView:objectValueForTableColumn:row: 

Si vous avez un tableau mutable dont les valeurs que vous souhaitez utiliser dans une vue de table avec une colonne, quelque chose comme ce qui suit devrait faire comme un début:

– numberOfRowsInTableView: (NSTableView*) aTableView 
{ 
    return [myMutableArray count]; 
} 

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    return [myMutableArray objectAtIndex: rowIndex]; 
} 

Il vient de vous me est apparu que pouvez ajouter les deux méthodes ci-dessus en tant que catégorie à NSArray remplaçant myMutableArray avec self et vous pouvez utiliser un tableau comme une source de données.


Quoi qu'il en soit, avec un tableau mutable, il est important que chaque fois que vous changez, vous devez laisser la vue du tableau sais qu'il a été changé, vous devez envoyer la vue du tableau -reloadData.


Si votre point de vue de la table a plus d'une colonne et que vous voulez le remplir avec les propriétés des objets dans votre tableau, il y a un truc que vous pouvez faire pour le rendre plus facile pour vous-même.Disons que les objets de votre tableau sont des instances d'une classe appelée personne avec deux méthodes définies:

-(NSString*) givenName; 
-(NSString*) familyName; 

et vous voulez que votre vue de table pour avoir une colonne pour chacun de ceux-ci, vous pouvez définir la propriété identifier de chaque colonne au nom de la propriété en personne que qui affiche des colonnes et utiliser quelque chose comme ce qui suit:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    Person* item = [myMutableArray objectAtIndex: rowIndex]; 
    return [item valueForKey: [tableColumn identifier]]; 
} 

Si vous remplacez valueForKey: avec valueForKeyPath: et votre classe Person a aussi les méthodes suivantes:

-(Person*) mother; 
-(Person*) father; 
-(NSString*) fullName; // concatenation of given name and family name 

Vous pouvez ajouter des colonnes de table avec des identifiants tels que: father.fullName ou mother.familyName et les valeurs seront automatiquement remplies.

1

Sur l'iPhone (je sais que vous parlez de Mac, mais peut-être que cela pourrait aider), vous devez utiliser la délégation pour charger un tableauView. Il demande une cellule et vous utilisez votre tableau pour remplir les données si nécessaire. Je ne sais pas si cela fonctionne pour le Mac, mais ça vaut la peine d'y jeter un coup d'œil.

Peut-être mis dataSource à l'auto et d'utiliser ces méthodes de délégués pour accéder à votre choix en fonction de la ligne et la colonne #

+0

@ réponse willcodejavaforfood est pour l'iPhone, mais vous pouvez suivre ce lien pour voir ce que je veux dire – RSully

+0

Oups, j'ai eu des iPhones sur mon cerveau :) – willcodejavaforfood

3

Vous pouvez parcourir la route de la source de données et effectuer vous-même tous les travaux de levage, ou vous pouvez laisser les reliures faire tout le travail de levage pour vous. Ajoutez un NSArrayController au fichier nib qui contient la vue de table. Assurez-vous que le propriétaire du fichier de la pointe est défini sur la même classe que le tableau mutable. Liez le contentArray du contrôleur RAID à File's Owner.myMutableArray. Pour chaque colonne, liez Value au contrôleur de matrice arrangedObjects et ajoutez le chemin de clé approprié. Cela vous permettra d'obtenir des choses comme le tri des utilisateurs gratuitement si vous en avez besoin.

Questions connexes