Erreur : Terminating app due to uncaught exception

PierrePierre Membre
18:41 modifié dans Vos applications #1
Bonjour à  tous,

J'ai l'erreur suivante :


*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "ChallengeView" nib but the view outlet was not set.'


Je pense qu'elle est lié à  cette ligne :
<br />ChallengeViewController *challengeViewController = [[ChallengeViewController alloc] initWithNibName:@&quot;ChallengeView&quot; bundle:nil];<br />


J'ai bien un fichier "ChallengeView.xib mais je doit sûrement avoir mal implémenté quelque chose.

Est-ce que quelqu'un à  une idée de ce que veut dire l'erreur et de là  ou je pourrais trouver plus d'informations pour la résoudre ?

Merci d'avance,
Pierre

Réponses

  • yoannyoann Membre
    18:41 modifié #2
    Ouvre le xib en question et va dans les outlet du FileOwner puis relie l'IBOutlet view à  ta vue principale
  • lgriffielgriffie Membre
    18:41 modifié #3
    loaded the &quot;ChallengeView&quot; nib but the view outlet was not set.&#39;
    


    Le message indique que tu as bien chargé le XIB file donc il a bien trouvé le fichier source .xib par contre tu as un outlet qui n'est pas définie correctement. As-tu bien créé les fichiers ChallengeView.h et ChallengeView.m et associée ta classe ChallengeView à  ton Xib file ?
  • PierrePierre Membre
    18:41 modifié #4
    @yoann : j'ai ajouté ce que tu m'as dit.
    Dans ChallenveView.xib > Files Owner > Outlets : la ligne View vers la vue de mon Interface Builder.

    @lgriffie : oui mes fichiers existent bien et j'ai relié mon XIB à  ma classe.

    Mon erreur maintenant est :

    *** -[UILabel copyWithZone:]: unrecognized selector sent to instance 0xd2f3d0
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[UILabel copyWithZone:]: unrecognized selector sent to instance 0xd2f3d0'


    Si je comprend bien il y a un problème avec un UILabel. Dans mon XIB pour le moment j'en ai deux. Un qui est remplis avec un texte statique et un second qui est remplis avec la contenu d'une variable.

    Comment interpréter l'erreur ?

    Merci encore pour votre aide,
    Pierre
  • yoannyoann Membre
    18:41 modifié #5
    Hum la tu essaye de faire des truc bizarre avec tes labels, quand tu a relier l'outlet view de tout à  l'heure, tu l'as bien relié à  la vue racine de ton xib qui est censé être une UIView et pas à  un des UILabel ?

    La il faudrait avoir les sources pour savoir ce qui merde...

    Regarde si tu n'as pas relier tes UILabel à  ce qu'il ne faut pas ou s'il n'y a pas d'erreur dans le UIViewController qui va avec
  • 18:41 modifié #6
    t'essaies pas de faire [monLabel copy]; ?  :P
  • lgriffielgriffie Membre
    18:41 modifié #7
    Dans ton interface de la classe tu as bien les outlet des label qui sont déclarés ?
  • PierrePierre Membre
    18:41 modifié #8
    Merci pour toutes vos réponses. :)

    J'ai réussi à  faire que ça marche (sur conseil d'un développeur avec qui je suis en contact) en renommant ma variable "title" en "titleLabel".

    Dans ChallengeViewController.h j'avais :

    <br />IBOutlet UILabel *title;<br />...<br />@property (nonatomic, retain) UILabel *title;<br />
    


    J'ai maintenant :
    <br />IBOutlet UILabel *titleLabel;<br />...<br />@property (nonatomic, retain) UILabel *titleLabel;<br />
    


    J'ai adapté ChallengeViewController.m pour que la variable "title" s'appelle "titleLabel", j'ai aussi modifié le fichier XIB et maintenant ça marche. Mais je n'ai pas compris pourquoi.

    Est-ce que l'un d'entre vous aurais une idée ? "title" est un mot réservé sur système ?

    En tout cas un grand merci pour vos pistes à  yoann, Eaglelouk et lgriffie.

    Problème résolue pour cette fois. :)
    Pierre
  • 18:41 modifié #9
    Si ta classe hérite de UIViewController, alors oui, title est réservé à  UIViewController !
    De toute façon, même si ça n'avait pas été le cas, il faut prendre l'habitude de réutiliser une portion du nom de la classe dans la ivar.
    Par exemple, si tu dois déclarer une ivar UIActivityIndicator, il vaut mieux la nommer "UIActivityIndicator *webserviceActivityIndicator;"

    C'est une habitude que j'ai pris, après je ne sais pas si tout le monde fait comme ça, mais je trouve qu'on s'en sort mieux par la suite !
  • PierrePierre Membre
    18:41 modifié #10
    Merci pour cet éclaircissement Eaglelouk.

    Dommage que XCode nous signale pas tout simplement que c'est un mot clef réservé du système.

    Je ferais attention à  l'avenir.

    Y as t'il une liste de mot clef à  éviter ?

    Pierre
  • lgriffielgriffie Membre
    18:41 modifié #11
    En utilisant la bonne pratique communiquée par Eaglelouk tu as très peu de chance de tomber sur un mot réservé. Après, tu as la description des propriétés d'une classe dans la doc Apple qui permets de savoir les chaà®ne à  ne pas utiliser. Au moins pour les API publiques car lorsqu'il s'agit d'API privées ben pas moyen. J'ai d'ailleurs eu une remarque lors de la revue d'une application le disant que j'utilisai une méthode nommée de manière identique à  une méthode Apple d'une API privée et il me demandait de renommer ma méthode...
  • PierrePierre Membre
    18:41 modifié #12
    @lgriffie : je vais prendre de bonnes habitudes tout de suite. ;)

    Pierre
  • yoannyoann Membre
    18:41 modifié #13
    pour ma part je préfixe mes variable par d'instance par _ (mais c'est pas bien par ce que réservé par Apple) ou dans mes cours je dis de faire i_ ou des truc du genre, l'intérêt étant d'éviter les conflits, et aussi d'avoir toutes nos ivar très rapidement à  l'auto-completion.
  • AliGatorAliGator Membre, Modérateur
    18:41 modifié #14
    Normalement il me semble que Xcode est sensé te le signaler sous forme d'un warning (à  condition bien sur que tu ne les aies pas désactivés), quand il détecte que tu as un conflit de type entre une propriété existante (title, un NSString) et une que tu essayes de surcharger (ton "title" à  toi, qui est UILabel)
  • PierrePierre Membre
    18:41 modifié #15
    @AliGator : dans mon cas je n'avais aucun "warning" pourtant ils sont bien activé (je les ai pour d'autres erreurs).

    Au moins j'aurais appris à  faire attention au nommage de mes variables. :)

    @tous : merci pour vos retours d'expérience et bonnes pratiques, je vais m'en inspirer pour essayer d'éviter ce genre de désagréments.

    Pierre
  • GreensourceGreensource Membre
    18:41 modifié #16
    Il y a le problème des conflits de variable et il y a aussi celui des noms de méthodes! Vachement vicieux aussi! J'ai un jour écrit une méthode qui avait la même signature que celle d'un framework, bas à  l'execution ce n'était pas la mienne qui était appellé, je te dit pas le bordel pour comprendre ce qui ce passais.  B)
  • PierrePierre Membre
    18:41 modifié #17
    @GreenSource : en effet ce ne sont pas des erreurs évidente à  cerner et à  comprendre.  :D

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