2010-10-17 6 views
1

Je construis une application Mac basée sur un document. J'ai deux classes myDocument et Person. La difficulté que j'ai est quand je pousse le bouton pour ajouter une nouvelle personne dans la vue de tableau et l'affiche n'apparaît pas dans la vue de tableau. J'ai placé des instructions de journal dans les méthodes de délégué. Comme mes instructions de log ne sont pas affichées dans la console, je sais qu'elles ne sont pas appelées. Voici les mises en œuvre des méthodes de déléguéPourquoi les méthodes déléguées de ma vue table ne sont-elles pas appelées?

- (int)numberOfRowsInTableView:(NSTableView *)aTableView 
    { 
     return [employees count]; 
    } 

    - (id)tableView:(NSTableView *)aTableView 
    objectValueForTableColumn:(NSTableColumn *)aTableColumn 
       row:(int)rowIndex 
    { 
     // What is the identifier for the column? 
     NSString *identifier = [aTableColumn identifier]; 
     NSLog(@"the identifier's name is : %s",identifier); 
     // What person? 
     Person *person = [employees objectAtIndex:rowIndex]; 

     // What is the value of the attribute named identifier? 
     return [person valueForKey:identifier]; 
    } 

    - (void)tableView:(NSTableView *)aTableView 
     setObjectValue:(id)anObject 
     forTableColumn:(NSTableColumn *)aTableColumn 
        row:(int)rowIndex 
    { 
     NSString *identifier = [aTableColumn identifier]; 
     Person *person = [employees objectAtIndex:rowIndex]; 
     NSLog(@"inside the setObjectMethod: %@",person); 

     // Set the value for the attribute named identifier 
     [person setValue:anObject forKey:identifier]; 

    [tableView reloadData]; 
} 

Voici une photo de mon .xib alt text

Voici mes méthodes d'action

#pragma mark Action Methods 
-(IBAction)createEmployee:(id)sender 
{ 
    Person *newEmployee = [[Person alloc] init]; 
    [employees addObject:newEmployee]; 
    [newEmployee release]; 
    [tableView reloadData]; 
    NSLog(@"the new employees name is : %@",[newEmployee personName]); 
} 
-(IBAction)deleteSelectedEmployees:(id)sender 
{ 
    NSIndexSet *rows = [tableView selectedRowIndexes]; 

    if([rows count] == 0){ 
     NSBeep(); 
     return; 
    } 
    [employees removeObjectAtIndexs:rows]; 
    [tableView reloadData]; 

}

+0

Vous n'avez pas besoin d'envoyer 'reloadData' à la vue table dans' tableView: setObjectValue: forTableColumn: row: ', car c'est la vue de table qui a envoyé ce message - elle connaît déjà la valeur modifiée. Il sera re-interroger à nouveau après juste au cas où vous substitué quelque chose d'autre. –

+0

Veuillez modifier votre question pour inclure l'implémentation de 'createEmployee:'. –

+0

J'ai ajouté l'implémentation de createEmployee – lampShade

Répondre

5

Vous avez oublié de lier la La tableViewView du document à la vue réelle de la table. Ainsi, vos messages reloadData sont envoyés à zéro.

+1

Chaque fois que j'ajoute un nouveau code action/sortie, je mets NSAssert (outlet! = Nil); quelque part dans le chemin. Parce que le plus souvent j'oublie de brancher toutes les connexions dans ib. –

Questions connexes