Problème affichage des vues

J'ai un problème au niveau de l'affichage de mes vues.


 


Quand je fais du pas à  pas, ma 1ère vue est bien chargée en mémoire tant dans la méthode didFinishLaunchingWithOptions que dans viewdidLoad.


Les différends NSLog insérés dans ma vue1 (celle qui devrait apparaitre à  l'écran en premier) s'affichent dans ma console.


Pour autant, l'écran affiché sur le simulateur est complément noir.


 


Voici mon code :


 


AppDelegate.m


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


{


    RootViewController *viewController = [[RootViewController alloc] init];


    self.rootViewController = viewController;


    //[viewController release];


    NSLog(@je passe dans didFinishLaunchingWithOptions);


    [self.window addSubview:rootViewController.view];


    NSLog(@view %@", viewController);


    /*


    self.window = UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds;


    // Override point for customization after application launch.


    self.window.backgroundColor = [UIColor whiteColor];


    */


     [self.window makeKeyAndVisible];


    return YES;


}


 

RootViewController.m


- (void)viewDidLoad


{


    NSLog(@je passe dans viewdidLoad);


 


    [super viewDidLoad];


    vue1 = [[Vue1 alloc] initWithFrame:self.view.bounds];


    [self.view addSubview:vue1];


    // Do any additional setup after loading the view.


}


 


Vue1.m


-(id)initWithFrame:(CGRect)frame {


    self = [super initWithFrame:frame];


    if (self) {


        


        // installation de mon fond


        monFond = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@fond320x179.png]];


        [self addSubview:monFond];



 


        // Bonton changement de vue


        buttonInfo = [UIButton buttonWithType:UIButtonTypeInfoLight];


        buttonInfo.frame = CGRectMake(([self bounds].size.width -50)/2-125, 110, 22, 22);


        [buttonInfo addTarget:self


                       action:@selector(allerALaVue2:)


             forControlEvents:UIControlEventTouchUpInside];


        buttonInfo.tintColor = [UIColor orangeColor];


        [self addSubview:buttonInfo];


 


...


 


 


Si quelqu'un avait une idée pour moi, cela serait très sympa  ;)


Réponses

  • CéroceCéroce Membre, Modérateur


     


        self.window = UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds;


        // Override point for customization after application launch.


        self.window.backgroundColor = [UIColor whiteColor];


        */


     




    Si tu ne crées pas de fenêtre, forcément, tu ne peux rien y mettre.


     


    P.S.: Débogue avec le débogueur, il suffit de mettre des points d'arrêt dans la marge. Déboguer avec NSLog() est lent et ne permet de voir que ce qu'on a prévu de voir.

  • CéroceCéroce Membre, Modérateur
    À proscrire:
     

        [self.window addSubview:rootViewController.view];

     
    Depuis iOS 5, je crois, Apple veut qu'on écrive:

     
    self.window.rootViewController = rootController;
    Autrement, un avertissement apparaà®t dans la console.


  • Si tu ne crées pas de fenêtre, forcément, tu ne peux rien y mettre.


     


    P.S.: Débogue avec le débogueur, il suffit de mettre des points d'arrêt dans la marge. Déboguer avec NSLog() est lent et ne permet de voir que ce qu'on a prévu de voir.




    Yes.


    j'ai utilisé également les points d'arrêts pour observer l'exécution du script.



  • À proscrire:

     

     

    Depuis iOS 5, je crois, Apple veut qu'on écrive:

     



     
    self.window.rootViewController = rootController;

    Autrement, un avertissement apparaà®t dans la console.

     




    Il n'y a aucun avertissement dans la console.


    C'est pour cette raison que je suis un peu largué

  • Joanna CarterJoanna Carter Membre, Modérateur
    Pourquoi pas créer les vues dans un storyboard ? C'est beaucoup plus faciles et bien conseillé.
  • j'avais mal préparé l'architecture de mon appli. 


    Erreur du débutant, j'imagine.


     


    Au départ j'étais partie sur une vue unique, et en route j'ai voulu en ajouté une autre.


    J'ai tenté d'intégré mon code dans un utility application, mais je n'y suis pas parvenue.  ???


    Je n'ai pas compris comment reprogrammer le UIButton pour aller sur la 2ème vue.

  • Très très très nette amélioration, merci.


     


    J'ai modifié comme suit mon code :


    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


    {


        // Création de la fenêtre de l'application


        self.window = [[UIWindow alloc] initWithFrame:</span><span style="color:#703daa;">UIScreen</span><span style="color:#000000;"> </span>mainScreen<span style="color:#000000;">] </span>bounds<span style="color:#000000;">;


        // Affichage de la fenêtre


        [self.window makeKeyAndVisible];


        // Création et insertion de notre contrôleur


        self.rootViewController = [[RootViewController alloc] initWithNibName:nil bundle:NULL];


                       self.window.rootViewController = self.rootViewController;


        return YES;


    }


     


    Mes vues s'affichent et les liaisons vue1 <> vue2 fonctionnent parfaitement.


    Par contre le backgroundColor est noir, alors que je ne l'ai pas programmé  ???


     


    En tout cas, encore merci à  vous pour vos réponses constructives et efficaces.  :D

  • Joanna CarterJoanna Carter Membre, Modérateur

    @ acrobat - je répète la question - c'est pourquoi que tu ne crées pas les vues dans un storyboard ?


     


    Si tu le faisais, tu aurais le code :



    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    return YES;
    }
  • @ Joann, j'ai tenté d'intégré mon code dans un utility application, mais je n'y suis pas parvenue.   ???


    Je n'ai pas compris comment reprogrammer le UIButton pour aller sur la 2ème vue.

  • Joanna CarterJoanna Carter Membre, Modérateur

    Le "utility application" - contient-il quelque chose qui fait partie de ton app ?


     


    Si non, il vaudrait mieux de recommencer à  nouveau avec un projet storyboard ; ça éviterait de la confusion.


     


    Quand tu as créé le projet, tu auras une vue vide dont tu pourras poser un bouton.


     


    Cherches le menu Editor et sélectionnes Embed in | Navigation Controller.


     


    Puis, tu peux ajouter un deuxième viewController à  côté du premier.


     


    Ctrl-drag du bouton vers le deuxième viewController et sélectionnes : (Xcode 5) push (Xcode 6) show


     


    Démarres l'app.


     


    Tu devrais avoir un app qui fonctionne - en cliquant sur le bouton, le deuxième vue s'apparaisse et le bouton Back s'apparaisse sur le bar de navigation.


     


    Aucune ligne de code !  :D


     


    Maintenant, tu peux commencer à  ajouter ta fonctionnalité, changer les UIViewControllers pour les UITableViewControllers ou autre choses. Les principes resteront les mêmes.


     


    SI tu n'as pas encore piger, demandes à  nouveau  :)


  • @Joanna, j'ai suivi tes conseils et utilisé le storyboard pour gérer vue1 <> vue2.


     


    Mais je suis bloquée au même point que lorsque j'ai voulu utiliser "utility application".


     


    Mon bouton semble être passé en second plan.


    En cliquant dessous on dirait qu'il ne s'active pas et donc pas de seconde page  ???


     


    Au niveau de la démarche, j'ai dans le story board :


    • 1 Navigation Controller Scene,
    • 2 View Controller

    J'ai associé mes viewcontroller et mes view du storyboard aux fichiers .h & .m correspondants.


     


    Je pense que çà  coince au niveau de mon code des - (void)viewDidLoad


    - (void)viewDidLoad


    {


        [super viewDidLoad];


    // Do any additional setup after loading the view, typically from a nib.


        vue1 = [[Vue1 alloc] initWithFrame:self.view.bounds];


        [self.view addSubview:vue1];


    }


     


    Pour mémoire, chacune de mes 2 vues ont été codé.

  • Suite de l'investigation.


    En modifiant ainsi le contrôleur de ma vue1: 


    - (void)viewDidLoad


    {


        [super viewDidLoad];


    // Do any additional setup after loading the view, typically from a nib.


        vue1 = [[Vue1 alloc] init];


        [self.view addSubview:vue1];


    }


     

    Le button info light redevient actif et me permet le passage à  la vue 2.

     

    Cependant, le positionnement de mes éléments de ma vue1 est déstructuré et le pickerView est figé.

    La vue2 quant à  elle fonctionne parfaitement.

     

    bouh, j'y pige rien.
  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2014 modifié #14

    C'est quoi, ce Utility Application dont tu parles ? 


     


    Tu devrais avoir un Navigation Controller et deux View Controllers, dont le premier est fait partie du Navigation Controller.


     


    Pourquoi ajoutes-tu une autre vue ? Tu devrais poser tes composants dans les vues qui sont déjà  dans les View Controllers.


     


    Tu veux m'envoyer le projet par MP afin que je puisse voir ce que tu as fait ?


     


    Oh, et quelle version de Xcode ?


  • Encore un grand merci.


     


    Utility application est un "format" prédéfini dans Xcode quand tu crées un nouveau projet.


     


    File/new/projet/IOS/Application icône n°2 sur ligne deux.


     


    Le projet créée contient un main View Controller et un Flipside View Controller et gère 2 vues avec une segue.


     


    Ps :


    MP envoyé.


    J'utilise Xcode Version 5.1.1 (5B1008).

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