ajouter une vue à  ma fenêtre

Bonjour à  tous,


 


J'ai fait une appli (schedulMediation) mais je voudrais lorsque je clique sur un bouton ajouter une vue (custom view ???) par dessus ma fenêtre principale et donc faire apparaitre ma nouvelle vue tout en inhibant l'autre.


J'ai fait une recherche mais sans succès, j'ai essayé de créer une classe héritant de UIView mais il me sort une erreur UIKit/UIkit.h file not found j'ai bien essayé de la linker dans build phases mais le framework est introuvable.


 


dà®tes moi si je fais fausse route.


Réponses

  • CéroceCéroce Membre, Modérateur
    septembre 2013 modifié #2

    J'ai fait une appli (schedulMediation) mais je voudrais lorsque je clique sur un bouton ajouter une vue (custom view ???)

    Une custom view est un objet qui hérite de NSView. En général, on n'en crée que lorsqu'on veut changer l'aparence (en surchargeant -drawRect:), ou la gestion des événements (méthodes héritées de UIResponder).
     

    par dessus ma fenêtre principale

    "Par dessus", ne veut rien dire. Soit tu crées une autre UIWindow, soit tu changes les vues qu'elle contient.

    Une NSWindow possède une contentView, qui en gros, fait sa taille moins la barre de titre.
    Il est possible de:
    - changer le contentView pour que ce soit une autre vue
    - ajouter ou retirer des subviews à  la contentView. En effet, les vues sont organisées de façon hiérarchique.

    A priori, c'est cette dernière option que tu dois retenir (et utiliser des NSViewController pour gérer chaque hiérarchie de vues).
     

    UIKit/UIkit.h file not found

    C'est normal, il n'y a pas de UIKit sur Mac OS X, mais un AppKit.
  • Ok je te remercie Céroce, je vois que je mélange un peu tout UIKit c'est pour l'iphone mais ce n'est pas évident de trouver les bonnes réponses même avec les bouquins...


    Donc il faut que je change ma "contentView" mais je m'y prend comment, quelle est la classe concernée ??

  • excuse moi je pense que j'ai trouvé le lien qui trouvera réponse à  mes interrogations.


  • CéroceCéroce Membre, Modérateur
    Oui, c'est bien ça, il devait juste te manquer les bons termes de recherche.
    Mais en gros, l'essentiel se fait avec les méthodes de NSView -addSubview: et -removeFromSuperview. La difficulté vient d'adapter les frames des vues, mais tu verras ;-)
  • Merci Céroce, mais je pensais m'orienter vers ce tutoriel.J'ai essayé, c'est beaucoup de liaisons dans IB mais pas trop de code.


    Est ce aussi une bonne solution ?


  • CéroceCéroce Membre, Modérateur
    septembre 2013 modifié #7
    Non, c'est complètement idiot de créer des NSViewController dans le xib.

    Pour chaque hiérarchies de vues que tu veux échanger, crée une sous-classe de NSViewController et un XIB qui porte le même nom.
    Ensuite, pour placer les vues contenues dans le xib, tu feras ça (probablement dans ta sous-classe de NSWindowController):
     
    MyViewController1 *controller1 = [[MyViewController1 alloc] initWithNibName:@MyViewController1 bundle:nil];
    controller1.view.frame = contentView.bounds;
    [contentView addSubview:controller1.view];
    Tu n'as ensuite, besoin de tirer les outlets et actions qu'entre les objets du xib et le view controller (n'oublie pas de définir la classe de File's Owner à  MyViewController1 dans le xib si ce n'est déjà  fait).

    Quand tu voudras échanger avec le VC2, tu enlèveras la view du VC1 (removeFromSuperview), et tu feras la même chose que ci-dessus.
  • ok je te remercie, j'ai vu que je faisais fausse route car lorsque mes vues ont été créées je n'ai pas trouvé le moyen de lier mes boutons de la custom view avec l'appli vu qu'elle se trouve dans le xib principal.


    C'est un peu l'usine à  gaz quand même quand on est pas habitué mais bon je m'accroche.




  • Non, c'est complètement idiot de créer des NSViewController dans le xib.


    Pour chaque hiérarchies de vues que tu veux échanger, crée une sous-classe de NSViewController et un XIB qui porte le même nom.

    Ensuite, pour placer les vues contenues dans le xib, tu feras ça (probablement dans ta sous-classe de NSWindowController):

     



    MyViewController1 *controller1 = [[MyViewController1 alloc] initWithNibName:@MyViewController1 bundle:nil];
    controller1.view.frame = contentView.bounds;
    [contentView addSubview:controller1.view];

    Tu n'as ensuite, besoin de tirer les outlets et actions qu'entre les objets du xib et le view controller (n'oublie pas de définir la classe de File's Owner à  MyViewController1 dans le xib si ce n'est déjà  fait).


    Quand tu voudras échanger avec le VC2, tu enlèveras la view du VC1 (removeFromSuperview), et tu feras la même chose que ci-dessus.


    Excuse moi Céroce d'abuser de ton temps mais malgré mes efforts je suis complètement perdu, j'ai suivi le tut plus haut et cela fonctionne mais malheureusement il faut que je place les changements de vue en dehors de la Box, mois ce que je veux c'est une interface principale et lorsque je clique sur un bouton changer de vue....


    J'ai essayé ta méthode mais je ne comprend pas la sous classe de NSWindowController, je n'arrive pas à  comprendre par quel bout prendre tout ça...


    Aurais tu un lien, j'ai bien lu la doc apple mais ça part tout azimuth, pas d'exemple précis...et sur le web il y en a que pour l'iphone.

  • CéroceCéroce Membre, Modérateur

    J'ai fait mieux... j'ai fait un article de blog:


    Une fenêtre qui change de view controller.


  • Ton article est très bien réalisé, j'ai déjà  réussi à  faire cela.


    Lorsque je clique sur un bouton appartenant à  mon xib1 je voudrais basculer vers xib2, alors que là  les boutons appartiennent au MainXib.


  • CéroceCéroce Membre, Modérateur

    Quand le bouton dans xib1 est actionné, alors le VC qui le gère doit dire à  l'objet qui gère MainXib qu'il faut basculer vers xib2.


    Utilise la design pattern Délégation pour cela.


  • @Céroce


    J'aurais volontier regardé ce que tu as fait. Mais je suis développeur "Gratuit". Donc je n'ai pas possibilité de télécharger les pré-release. Donc pas de Xcode 5, pas d'OSX 10.9.


    Sous Xcode 4.6.3 j'obtiens:  


    Please use a newer version of Xcode. Consider changing the document's Development Target to preserve compatibility.


    Comme c'est une compatibilité d'exécution et non de développement, je suis coincé jusqu'à  la sortie officielle de xcode 5 et OSx 10.9.


  • CéroceCéroce Membre, Modérateur

    Xcode 5 sera dispo très prochainement.


    Ceci dit, l'article donne vraiment toutes les infos.


  • protocommprotocomm Membre
    septembre 2013 modifié #15

    euh, je fais ça comment avec le "design pattern Délégation" car j'ai fait des recherches sur google et je tombe sur decorator factory...du chinois quoi !!!


    C'est bizarre car les NSLOG d'une vue à  l'autre sont bien transmis donc lorsque je clique sur un bouton l'action associée est bien active mais si je veux remplir un NSTextField ça ne fonctionne plus ??


     


    MERCI.


  • CéroceCéroce Membre, Modérateur

    euh, je fais ça comment avec le "design pattern Délégation" car j'ai fait des recherches sur google et je tombe sur decorator factory...du chinois quoi !!!




    Par exemple cet article.

    Apple a aussi un guide "Cocoa Design Patterns" qui l'explique.

     



    C'est bizarre car les NSLOG d'une vue à  l'autre sont bien transmis donc lorsque je clique sur un bouton l'action associée est bien active mais si je veux remplir un NSTextField ça ne fonctionne plus ??



    Rien compris.


  • Merci Céroce pour tes réponses, il est vrai que je ne suis pas très clair mais dans ma tête non plus...c'est un peu le fouillis.

Connectez-vous ou Inscrivez-vous pour répondre.