NSArrayController et mise-à -jour d'une TableView

helgrindhelgrind Membre
19:05 modifié dans API AppKit #1
Bonjour,
J'utilise les bindings et Core Data pour remplir une tableview.

Quand j'appele la méthode add: de NSArrayController pour ajouter une ligne, j'aimerais pouvoir éditer la nouvelle ligne -et pas seulement la sélectionner.
J'ai donc créé une sous-classe de NSArrayController où j'implémente la méthode add: et je demande à  ma tableView d'éditer la ligne correspondante.
- (void)add:(id)sender<br />{<br />&nbsp; &nbsp; [super add:sender];<br />&nbsp; &nbsp; int selectedRow = [tableView selectedRow];<br />&nbsp; &nbsp; [tableView editColumn:1 row:selectedRow withEvent:nil select:YES];<br />}


Or la sélection de la tableView n'est pas mise-à -jour et j'obtient la ligne sélectionnée précédente... ???
:why?:

Réponses

  • ClicCoolClicCool Membre
    février 2008 modifié #2
    Je me demande si c'est pas simplement du au fait que le [super add:sender] n'est peut-être exécuté complètement qu'une fois que ta méthode est terminée ...
    add:
    Special Considerations

    Beginning with Mac OS X v10.4 the result of this method is deferred until the next iteration of the runloop


    Peut-être aurais-tu plus de succès (sans forcément sous-classer l'arrayController mais) en créant toi même ton entitée à  ajouter (ses liens surtout) puis en appelant addObject: au lieu de add: .

    [EDIT] Sous-Classer un ArrayContrôller en lui donnant un pointeur sur une tableView ça me paraà®t pas idéal ce truc là  . 
  • ClicCoolClicCool Membre
    19:05 modifié #3
    Plus j'y pense, helgrind, plus je trouve que sous-classer NSArrayContrôller pour cette tâche est inapproprié.

    Pourquoi ne pas soit:
    - T'inscrire comme délégué de ta tableView et, à  chaque tableViewSelectionDidChange vérifier si c'est du à  l'ajout d'un nouvel élément ...

    - Ou, puisque tu utilises Core Data, surveiller les notifications NSManagedObjectContextObjectsDidChangeNotification et vérifier si c'est une NSInsertedObjectsKey sur l'entité qui t'intéresses ?




    D'une façon générale il me semble qu'il faut prendre garde à  ne pas sous-Classer trop facilement pour une tâche qui peut être accomplie autrement.
    Surtout si en sous-classant on brise un peu le MVC paradigme en créant une référence directe à  un élément d'interface dans une partie contrôleur plus conçue pour ne gérer en direct que la source de données.
  • helgrindhelgrind Membre
    19:05 modifié #4
    Bon d'accord c'est pas une bonne idée la sous-classe  :)

    Je viens d'essayer avec
    [arrayController addObject:[arrayController newObject]];
    


    puis d'éditer la ligne, et là , ca marche  ::)
    Merci.
  • ClicCoolClicCool Membre
    19:05 modifié #5
    dans 1204052910:
    [arrayController addObject:[arrayController newObject]];
    


    Ah ben OUI !! :)
Connectez-vous ou Inscrivez-vous pour répondre.