Eclatement d'une appli "mono-nib" en appli "multi-nib"

olofolof Membre
08:41 modifié dans API AppKit #1
Bonjour à  tous,

j'ai une application "Document Based" qui commence à  grossir pas mal (une fenêtre principale + 5-6 views qui s'affichent dans des Drawers). Toutes les vues sont dans le même nib. J'aimerais créer un nib et un ViewController par vue. J'ai commenté avec une première vue mais je bute déjà  sur un problème.

J'ai donc une classe qui hérite de NSDocument et qui est le File's Owner de mon nib. Comme la fenêtre contient principalement une TableView, je gère les objets suivants dans cette classe :

- objet "racine" de mon modèle (qui contient entre autres une NSArray d'objets que j'affiche dans ma TableView)
- l'objet sélectionné (si il y en a un) de ma TableView

J'ai déplacer une première vue du nib principal dans son propre nib (lié à  un ViewController). Cette dernière affiche le détail de la ligne sélectionnée dans la TableView. J'affiche cette vue dans un Drawer. Jusque là , ça fonctionne. Mon problème est que je dois indiquer à  ce nouveau ViewController quel est l'objet sélectionné dans la TableView. Or cet objet peut changer pour plusieurs raisons. Je trouverais plus sûr que mon ViewController puisse accéder à  l'objet sélectionné géré dans ma classe NSDocument. Possible ?

Je ne sais pas si j'ai réussi à  être suffisamment clair... Dites-moi si mon post est juste incompréhensible  xd


Merci beaucoup !

Réponses

  • AliGatorAliGator Membre, Modérateur
    08:41 modifié #2
    Utilise le KVO (voire les bindings qui sont basés dessus).
    Quand ton objet sélectionné dans ta TableView change, tous les observeurs sont notifiés, donc si tu t'abonnes dans ta vue pour être notifié du changement de valeur tu pourras agir en conséquence.

    Le KVO est fait pour ça.
    Ca n'a pas grand chose à  voir avec le multi-nib à  part que comme il te permet de te passer de connexions en dur puisqu'il utilise le pattern Observer, tu n'as pas à  rajouter d'outlets pour accéder à  tous les éléments qui dépendent de la sélection (genre ton drawer) depuis le controller qui change la sélection (genre ta fenêtre principale) puisque ça utilise les notifications... donc c'est d'autant plus utile quand l'accès à  ces éléments dépendants ne sont pas facilement accessibles (comme toi du fait que tu sépares tes NIB) vu que tout reste indépendant et que ce sont les notifications qui sont envoyées au NotificationCenter et dispatchent ensuite aux objets.
  • laudemalaudema Membre
    08:41 modifié #3
    C'est, de plus, très bien spécifié dans la documentation Apple qu'un NSViewController a une propriété representedObject to make it easy to establish bindings.
    Normalement tu n'as qu'à  trouver un chemin entre ce "representedObject" et ton NSArrayController.selection. Attention néanmoins ce n'est pas vraiment l'objet mais un proxy vers cet objet qui est utilisé.. Donc ça marche bien surtout pour afficher les valeurs pas pour d'autres manipulations car proxy "does not respond to selector" comme le vrai objet.
  • olofolof Membre
    08:41 modifié #4
    Nom d'une pipe en bois, je ne pensais plus au KVO.


    Merci !
  • HerveHerve Membre
    08:41 modifié #5
    C'est même plus simple et plus rapide de faire un logiciel à  multiples fenêtres qu'à  une seule je trouve...
Connectez-vous ou Inscrivez-vous pour répondre.