[Résolu] - Sélection d'une ligne dans une NSTableView

skimpyskimpy Membre
décembre 2011 modifié dans API AppKit #1
Bonjour,

J'ai une NSTableView dont le content et le Selection Indexes sont liés à  un Array Controller ; celui-ci est lui même lié à  un Managed Object Context.
Lorsque j'ajoute une entrée dans la table, j'aimerais que celle-ci soit sélectionnée automatiquement. Pour ajouter une entrée, je procède de la façon suivante :

NSManagedObject *newItem = [NSEntityDescription insertNewObjectForEntityForName:myEntity inManagedObjectContext:yMoc];

L'entrée apparaà®t bien dans la tableview mais lorsque j'appelle la méthode suivante [myArrayController setSelectionIndexes:[NSIndexSet indexSetWithIndex:[myTableView numberOfRows] - 1]] pour sélectionner la dernière ligne insérée, il me sélectionne la 1ère ligne. Si je remplace -1 par -2, il me sélectionne l'avant dernière-ligne de la table ... c'est comme si la tableview n'était pas informée qu'une nouvelle entrée avait été faite (j'ai mis un NSLog(@Nombre de ligne : %ld, [myTableView numberOfRows]) avant et après insertion, et le nombre est identique).

Est-ce que j'ai oublié quelque chose ?

Merci.

Réponses

  • CéroceCéroce Membre, Modérateur
    décembre 2011 modifié #2
    ça doit fonctionner, je fais ainsi dans mon code.

    Quand tu ajoutes une entrée dans le MOC, le NSArrayController reçoit une notification KVO, puisqu'il observe le MOC.
    La NSTableColumn observe le NSArrayController. À mon avis, tu changes selectionIndex avant que le NSArrayController n'ait envoyé la notification KVO de modification d'arrangedObjects.

    Ce sont des problèmes temporels difficiles à  régler, mais avec le débogueur, on y arrive.  ;)
    Par ailleurs, il y a une case à  cocher sur NSArrayController pour sélectionner automatiquement la dernière ligne (mais ça ne fonctionne pas toujours).
  • skimpyskimpy Membre
    04:47 modifié #3
    Merci Céroce. J'avais décoché la case "Select Inserted Object" mais la réactiver n'a rien fait de plus. Au niveau debug, je ne vois pas où chercher car la séquence d'ajout est très simple :

    - J'ai un bouton Add qui appelle l'IBAction addItem. Dans addItem, voilà  ce que je fais :

    <br />&nbsp; &nbsp; NSLog(@&quot;Avant ajout : Nombre de ligne : %ld&quot;, [myTableView numberOfRows]);<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSManagedObject *newItem = [NSEntityDescription insertNewObjectForEntityForName:myEntity inManagedObjectContext:myMOC];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [newItem setValue:[NSNumber numberWithUnsignedInteger:1] forKey:@&quot;index&quot;];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;Après ajout : Nombre de ligne : %ld&quot;, [myTableView numberOfRows]); <br />&nbsp; <br />&nbsp; &nbsp; [myArrayController setSelectionIndexes:[NSIndexSet indexSetWithIndex:[myTableView numberOfRows] - 1]];<br /><br />&nbsp; &nbsp; NSFetchRequest *request = [[NSFetchRequest alloc] init];<br />&nbsp; &nbsp; [request setEntity:[NSEntityDescription entityForName:myEntity inManagedObjectContext:myMOC]];<br />&nbsp; &nbsp; [request setIncludesSubentities:NO];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSError *err;<br />&nbsp; &nbsp; NSUInteger numberOfItems = [myMOC countForFetchRequest:request error:&amp;err];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSLog(@&quot;numberOfItems : %ld&quot;, numberOfItems);<br />
    


    Par défaut, je n'ai qu'une entrée dans ma tableview. Donc au début de l'exécution de la méthode, je vois bien : Avant ajout : Nombre de ligne : 1 et après l'insertion, j'ai toujours : Après ajout : Nombre de ligne : 1. Par contre j'ai bien un numberOfItems = à  2.

    Quel genre de tests supplémentaires pourrais-je faire ?

    Merci.
  • skimpyskimpy Membre
    04:47 modifié #4
    J'ai rajouté un appel à  processPendingChanges et maintenant ça marche.
Connectez-vous ou Inscrivez-vous pour répondre.