Problème d'accès/communication entre NSViews

Paisible.frPaisible.fr Membre
10:34 modifié dans API AppKit #1
Bonjour,

Je rencontre un problème d'accès/communication entre plusieurs NSViews.
Voici comment ce présente mon application :

Organisation des XIBs :
- Une MainWindows et une SplitView (la partie gauche sert de source, la droite de contenu : à  la "iLife")
- Une NSView contenant un text field que je place dans la vue de droite de la splitView
- Une NSView que je place dans la partie gauche de la SplitView. Cette vue contient un NSSegmented avec 3 etats et une NSCustomView.
- 3 NSViews que je place dans la NSCustomView de la prècendente en fonction de l'état du NSSegmentedView

Détails en image :
ViewHierarchy.JPG

Problème :
J'arrive très bien à  faire fonctionner tout cela à  l'aide de NSWiewController afin d'afficher les vues les unes dans les autres et de changer une vue par une autre lorsque c'est nécessaire.

En revanche je n'arrive pas à  acceder au TextField de la partie "contenu" lorsque je fait un cliq dans un objet de la partie Source.

Concrétement j'ai dans la partie source une table avec des élements et lorsque je clique sur une ligne j'aimerais afficher un texte dans le textField de la partie contenu.

Mais je ne sais comment accéder à  cette objet...

Réponses

  • Philippe49Philippe49 Membre
    10:34 modifié #2
    dans 1225697634:

    En revanche je n'arrive pas à  acceder au TextField de la partie "contenu" lorsque je fait un cliq dans un objet de la partie Source.

    Concrétement j'ai dans la partie source une table avec des élements et lorsque je clique sur une ligne j'aimerais afficher un texte dans le textField de la partie contenu.

    Mais je ne sais comment accéder à  cette objet...


    Quand tu dis table, il s'agit d'une Table View sans doute.
    Si c'est le cas, tu désigne ton contrôleur comme delegate de cette table view, qui réagira à  l'action de l'utilisateur par une action sur le Text Field. le contrôleur a accès au text field directement par un IBOutlet, ou indirectement via la NSView contenant le text field
  • Paisible.frPaisible.fr Membre
    10:34 modifié #3
    dans 1225699371:

    Quand tu dis table, il s'agit d'une Table View sans doute.
    Si c'est le cas, tu désigne ton contrôleur comme delegate de cette table view, qui réagira à  l'action de l'utilisateur par une action sur le Text Field. le contrôleur a accès au text field directement par un IBOutlet, ou indirectement via la NSView contenant le text field

    1) Oui il s'agit d'une NSTableView évidement
    2) Je sais recupérer le click sur une ligne de la NSTableView  via le Delegate.

    Ce que me pose problème c'est de faire le IBOutlet vers le TextField qui est dans un autre XIB dans IB.
  • Philippe49Philippe49 Membre
    novembre 2008 modifié #4
    Tu as sans doute un view controller (classe MyViewControllerTextField) pour le second XIB. Il doit apparaà®tre dans le xib principal en tant qu'objet du xib, et le File's owner du xib en être un représentant.
    • Attribuer à  File's Owner la classe MyViewControllerTextField
    • Connecter l'IBOutlet textField dans le second xib
    • Importer dans le premier XIB un objet auquel tu attribues la classe MyViewControllerTextField
    et ça devrait rouler ..

  • Philippe49Philippe49 Membre
    novembre 2008 modifié #5
    supprimé
  • Paisible.frPaisible.fr Membre
    novembre 2008 modifié #6
    Bonjour,

    Merci Philippe49 pour tes tentatives d'explications. Malheureusement je n'ai toujours pas compris.
    J'ai essayé d'appliquer tes explications sans succès malgrè deux heures d'acharnement.  :crackboom:-

    Voici ce que j'ai fait :

    (j'ai simplifié par rapport au message initiale pour eviter une trop grande profondeur dans la hierarchie des vues)


    MainWindow.XIB :
    - 1 Object controller avec la classe MainWindowController.m
    - 1 Object custom view avec une SplitView (avec un IBOutlet dans le MainWindowController.m )
    - 1 Object application
    - 1 Object FirstReponder

    SourceView.XIB :
    - 1 Object controller avec la classe SourceViewController.m
    - 1 Object custom view avec une NSTable (avec le delegate pour gerer la table et reagir au click sur une ligne)
    - 1 Object application
    - 1 Object FirstReponder

    ContentView.XIB :
    - 1 Object controller avec la classe ContentViewController.m
    - 1 Object custom view avec un TextField (avec IBOutlet dans le ContentViewController.m )
    - 1 Object application
    - 1 Object FirstReponder

    Dans le MainWindowController.m au awakeFromNib :
    - je charge le SourceView.XIB et je place sa vue dans la vue de gauche du Splitview
    - je charge le ContentView.XIB et je place sa vue dans la vue de droite du Splitview

    Jusque là  tout va bien et j'arrive a lancer l'application avec les vues qui s'affichent correctement et la table qui est gérée (click sur une ligne). En revanche je n'arrive toujours pas à  aller changer le contenu de la TextField du ContentView depuis un evenement dans ma sourceView.

    J'ai essayé de rajouter un object avec la classe ContentViewController.m dans le SourceView.XIB.
    J'arrive alors à  relier un IBOutlet dans le SourceView vers la vue de l'object ContentViewController.m

    Mais je ne parvient toujours pas à  avoir un IBOulet vers le TextField depuis ma SourceView ou à  y acceder par programmation.
  • Philippe49Philippe49 Membre
    10:34 modifié #7
    MainWindow.XIB :
    - 1 Object controller avec la classe MainWindowController.m  ajouté au nib
    - 1 Object custom view avec une SplitView (avec un IBOutlet dans le MainWindowController.m )
    - 1 Object application
    - 1 Object FirstReponder
    +le file's owner à  laisser en l'état

    SourceView.XIB :
    - 1 Object controller avec la classe SourceViewController.m =le File's Owner
    - 1 Object custom view avec une NSTable (avec le delegate pour gerer la table et reagir au click sur une ligne)
    - 1 Object application
    - 1 Object FirstReponder
    Ne pas oublier de connecter

    ContentView.XIB :
    - 1 Object controller avec la classe ContentViewController.m =le File's Owner
    - 1 Object custom view avec un TextField (avec IBOutlet dans le ContentViewController.m )
    - 1 Object application
    - 1 Object FirstReponder
    Ne pas oublier de connecter

    Dans le MainWindowController.m au awakeFromNib :
    - je charge le SourceView.XIB et je place sa vue dans la vue de gauche du Splitview
    là  tu crées sans doute une instance de SourceViewController, et tu lui attribues une référence sur le mainViewController, ou sur le contentViewController
    - je charge le ContentView.XIB et je place sa vue dans la vue de droite du Splitview
    idem


    En revanche je n'arrive toujours pas à  aller changer le contenu de la TextField du ContentView depuis un evenement dans ma sourceView.

    Utiliser les connexions entre les contrôleurs
  • Paisible.frPaisible.fr Membre
    10:34 modifié #8
    Je suis désolé,mais j'arrive vraiment toujours pas !  :'( :'( :'(
    Je ne comprends pas ce que tu entends par "Ne pas oublier de connecter "

    J'ai ça :
    APP1.png
    Le File's Owner est un NSObject. L'autre object est de une instance de "MainWindowController.m"

    APP2.png

    APP3.png

    APP4.png
    J'arrive toujours pas à  voir comment je peux connecter mon outlet à  ma webView (remplace le textField precedent).
  • Philippe49Philippe49 Membre
    10:34 modifié #9
    Ci-joint une architecture correspondant à  ton premier schéma
Connectez-vous ou Inscrivez-vous pour répondre.