Plume chargée mais la prise de vue n'a pas été définie

742

J'ai ajouté un nouveau fichier nib à mon projet et j'ai essayé de le charger.

Cependant, lorsque je clique sur l'icône de la barre d'outils qui est censée m'amener à la vue que j'ai créée, j'obtiens un NSInternalInconsistencyExceptionavec le message:

Arrêt de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: '- [UIViewController _loadViewFromNibNamed: bundle:] a chargé la plume "..." mais la sortie de la vue n'a pas été définie.'

J'ai donc ouvert mon fichier nib, et je vois pour la vue qu'il n'y a pas de prises de référence définies. Cependant, j'essaie de cliquer et de faire glisser le cercle de "nouvelle prise de référence" vers le propriétaire du fichier, mais cela ne me laissera pas ... que dois-je faire pour que ma vue s'affiche?

John
la source
1
Essayez d'abord de nettoyer la version.
LetynSOFT
Dans mon cas, la véritable erreur est que j'ai défini une méthode dans viewController (- (void) setValue: (NSNumber *) valeur forKey: (NSString *) key) qui remplace la méthode ViewController à l'origine de l'erreur. J'ai résolu de renommer cette méthode
Christian Mini

Réponses:

1807

Vous avez raison, mais comme je suis un nouveau venu, il m'a fallu un peu de temps pour comprendre toutes les étapes à suivre. Voici ce qui a fonctionné pour moi:

  • Ouvrez le fichier XIB provoquant des problèmes
  • Cliquez sur l'icône du propriétaire du fichier dans la barre de gauche (celle du haut, ressemble à une boîte jaune)
  • Si vous ne voyez pas la barre latérale de droite, cliquez sur la troisième icône au-dessus de "voir" dans votre barre d'outils. Cela montrera la barre latérale droite
  • Dans la barre latérale droite, cliquez sur le troisième onglet - celui qui ressemble un peu à un journal
  • Sous "Classe personnalisée" en haut, assurez-vous que Classe est le nom du ViewController qui doit correspondre à cette vue. Sinon, entrez-le
  • Dans la barre latérale droite, cliquez sur le dernier onglet - celui qui ressemble à un cercle avec une flèche dedans
  • Vous devriez voir "points de vente" avec "vue" en dessous. Faites glisser le cercle à côté de celui-ci jusqu'à l'icône "Affichage" sur la barre de gauche (celle du bas, ressemble à un carré blanc avec un contour gris épais
  • Enregistrez le xib et relancez
Josh Justice
la source
J'ai également rencontré ce problème sur le cacao et tant que la vue n'était pas chargée / ajoutée à la hiérarchie des vues, toutes les sorties de vue étaient NIL. Après avoir appelé addSubview ou quelque chose de similaire, tous les points de vente ont été connectés. La partie amusante de mon histoire était que po viewcontroller.view.subviews a montré les objets manquants.
Apoc
11
Cette solution ne fonctionne plus dans Xcode 7.3 à partir des étapes 4 et 5. Au lieu de cela, dans le générateur d'interface, faites glisser la souris du propriétaire du fichier vers votre vue tout en maintenant la touche Ctrl enfoncée.
PeiweiChen
2
Cela n'a pas fonctionné pour moi (pas de section de prises dans l'inspecteur de connexion, donc pas de "vue" sous les prises pour se connecter), mais +1 pour l'effort que vous avez mis dans votre réponse. :)
William T. Mallard
2
Si vous ne voyez pas "voir" dans les prises, vous pouvez également faire glisser le curseur du propriétaire des fichiers vers la vue du storyboard. Un menu contextuel devrait apparaître avec une option "voir"
josef
1
@ WilliamT.Mallard J'ai le même comportement. MyViewControllerest une sous-classe de sous-classe de UIViewControlleret il n'y en a pas viewsous "Outlets". Si je sous-classe MyViewControllerdirectement de UIViewControllerla vue apparaît sous "Outlets". Magie ou bug de Xcode.
user2319066
201

Ceci est la proposition de Josh Justice, mais de manière graphique (les photos sont les miennes):

  1. Sélectionnez le propriétaire du fichier
  2. Sur le panneau de droite, sélectionnez une classe personnalisée.
  3. Entrez le nom de classe personnalisé

entrez la description de l'image ici

  1. Sur le panneau de droite, sélectionnez les sorties
  2. Faites glisser la sortie de vue pour afficher le composant

entrez la description de l'image ici

Enfin, le View Controller est instancié avec le code tournant:

        PTFilterUserVC *aFilterUserVC = [[PTFilterUserVC alloc] initWithNibName:@"FilterVC" bundle:nil];

        //OPTIONAL.This is how 'I' am interested in present the view controller.
        [self.navigationController pushViewController:aFilterUserVC animated:YES];
Javier Calatrava Llavería
la source
1
Merci Javier Calatrava Llavería ... m'a beaucoup aidé après m'avoir frappé la tête pendant une heure !!!
BharathRao
un exito muchas gracias
Bruno Sosa Fast Tag
J'ai raté la 5e étape
hamada147
73

Je peux généralement le corriger en refaisant la connexion entre le propriétaire du fichier et la vue. Faites glisser la souris du propriétaire du fichier vers votre vue (dans IB) et sélectionnez la vue dans le menu local.

Rohit Mandiwal
la source
62

L'identité de vue - Identité de classe n'a pas été définie. Après l'avoir défini sur la classe appropriée, le problème a été résolu.

John
la source
Salut @John, je l'ai fait mais j'obtiens toujours cette exception.
Mansuu ....
29

Êtes-vous sûr d'avoir une UIView (ou une sous-classe) affectée à la propriété "view" de votreViewController?

Faites un clic droit sur "Propriétaire du fichier" dans le volet gauche de la xib pour votre ViewController et vérifiez que la sortie "vue" est définie. Sinon, réglez-le sur une vue!

cela résoudra définitivement le problème

Shehbaz Khan
la source
2
Réponse claire et concise.
sark9012
15

Pour moi, toutes les choses indiquées ici https://stackoverflow.com/a/6395750/939501 étaient vraies, mais cela renvoyait une erreur, la raison était que j'ai créé une classe View avec le nom ABCView, puis supprimée plus tard.J'ai ajouté un contrôleur de vue en tant que ABCViewController donc en quelque sorte il faisait référence à l'ancien ABCView dans le nouveau contrôleur de vue, j'ai dû supprimer l'ABCViewController et en ajouter un nouveau avec un nom différent qui a résolu mon problème.

Merci

vishal dharankar
la source
Encore un bug en 2020.
Tamás Sengel
15

J'ai eu le même problème avec XCode 4.6.3. J'avais commencé avec quelques fichiers nommés MySettingsView.het les ai .msupprimés en faveur de MySettingsViewController.h, mais en dépit de la plupart des conseils mentionnés ici, il continuait à l'erreur,

2013-07-05 11: 48: 17.205 MyApp [39024: c07] *** Fin de l'application en raison d'une exception non interceptée 'NSInternalInconsistencyException', raison: '- [UIViewController _loadViewFromNibNamed: bundle:] a chargé la pointe "MySettingsView" mais la sortie de la vue n'était pas réglé.

Il était évidemment toujours "confus", essayant de charger MySettingsView.xib au lieu de MySettingsView Controller .xib. Peut-être que sa logique "fais ce que je veux dire" est trop fantaisiste.

J'ai donc contourné le problème en codant en dur le nom NIB / XIB dans MySettingsViewController.m:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:@"MySettingsViewController" bundle:nibBundleOrNil];
}
Nathan
la source
10

Si vous utilisez une méthode xib pour créer une UIView et que vous rencontrez ce problème, vous remarquerez que vous n'aurez pas la sortie "view" sous le menu de l'inspecteur de connexions. Mais si vous définissez la classe personnalisée Propriétaires du fichier sur un UIViewController et que vous verrez alors la prise "view", que vous pouvez simplement CMND connecter une prise à CustomView.

manapate
la source
Impressionnant. Merci beaucoup. Cela devrait être une réponse acceptée!
Roman
7

Mon problème avec cela a été causé par le fait d'avoir une plume en double dans le dossier de classe qui n'avait pas la vue définie. xcode semblait choisir une plume pour une construction, puis l'autre la prochaine fois que je construisais le projet. Je viens de supprimer l'autre. Cela semble bon. Ah!

Mat
la source
6

Je viens de passer plus d'une heure à essayer de comprendre pourquoi ma propriété de vue n'est pas définie dans mon contrôleur de vue lors de son lancement à partir de nib. N'oubliez pas d'appeler "[super initWithNibName ...]" à l'intérieur de initWithNibName de votre contrôleur de vue.

Kamil.S
la source
5

Je viens de corriger ça dans le mien. Grand projet, deux fichiers. L'un était "ReallyLargeNameView" et un autre était "ReallyLargeNameViewController"

Sur la base de la 2e réponse choisie ci-dessus, j'ai décidé de nettoyer ma version. Nada, mais j'étais toujours suspect de XCode (comme j'ai deux classes identiques, je devrais les résumer mais hein ...) Donc on travaille, on ne fonctionne pas. Les noms des propriétaires des fichiers sont pour autant copiés et collés, les prises recrochées, xCode redémarré, toujours rien.

Je supprime donc la classe nommée similaire (qui est une vue). Bientôt, une nouvelle erreur "sortie à l'intérieur non connectée" était littéralement "webView pas la valeur clé" blah ... disant essentiellement "Visual Studio est meilleur". Quoi qu'il en soit ... j'efface le plus petit fichier nommé, et bam, ça marche.

XCode est confondu par des fichiers de nom similaire. Et le projet est assez grand pour nécessiter un redémarrage un peu, cela peut en faire partie.

J'aurais aimé avoir une réponse plus technique que "XCode est confus", mais bon, xCode se confond beaucoup à ce stade. Non confondu de la même manière que j'aiderais un petit enfant. Cela fonctionne maintenant, :) Devrait bénéficier aux autres si ce qui précède ne résout rien.

N'oubliez pas de nettoyer vos builds (en supprimant également le simulateur)

Stephen J
la source
4

J'ai également eu le même problème et mon problème était que j'ai ajouté une autre localisation (anglais) à la pointe ViewControllers afin que mon application avec la localisation allemande ne puisse pas trouver la pointe avec la localisation anglaise !! J'espère que cela aide n'importe qui!

Weini
la source
4

J'ai eu le même problème en supprimant accidentellement la référence xib et en l'ajoutant à nouveau.

Nidhin
la source
3

Pour moi, le problème a été causé par l'appel initWithNibName:bundle:. J'utilise des cellules de vue tabulaire à partir d'un fichier nib pour définir les formulaires d'entrée qui s'y trouvent tableViews. Comme je n'ai pas de vue, cela n'a pas de sens de s'y accrocher. Au lieu de cela, si j'appelle la initWithStyle:méthode à la place, et à partir de là, je charge le fichier nib, alors les choses fonctionnent comme prévu.

DaveDude
la source
3

Les réponses précédentes ont presque résolu le problème pour moi, mais la dernière étape manquait.

  1. Créez un fichier xib et swift du même nom.

Ajouter une vue et un fichier Swift

  1. Définissez le propriétaire du fichier comme étant la sous-classe UIView.

entrez la description de l'image ici

  1. Faites glisser une sortie de la vue vers la sous-classe UIView, nommez-la "contentView"

ajouter la vue du contenu

  1. Ajoutez cet initialiseur personnalisé afin que lorsque le xib se charge, il attache le contenu

ajouter la vue de contenu en tant que sous-vue

required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle(for: self.classForCoder).loadNibNamed("SampleView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
    }

Maintenant, tous les @IBOutlets que vous ajoutez seront joints.

À la vôtre, Richard

COSMO BAKER
la source
2

J'ai eu le même problème, mais une solution légèrement différente était nécessaire. Le problème dans ce cas était la classe du propriétaire du fichier plutôt que la classe de la vue. Pour définir cela, j'ai dû cliquer sur l'icône "lecture en arrière" dans le coin inférieur gauche de la fenêtre Interface Builder, et des options sont alors apparues qui isolaient les caractéristiques du propriétaire du fichier, du premier répondant et de la vue. Cliquer sur le premier (une grande boîte transparente), m'a permis de définir ensuite sa classe personnalisée comme suggéré ci-dessus.

Michael Stern
la source
2

J'ai eu le même problème, mais une solution différente était nécessaire. Le problème dans ce cas était que la classe du propriétaire du fichier n'était pas connectée au fichier xib.

user1951454
la source
2

J'ai rencontré quelque chose de très similaire ce soir, avec une sous-classe Swift UIViewController. Dans ce cas, aucun des correctifs ci-dessus n'a fonctionné, mais un peu de réorganisation de mon code l'a fait. Net-net, avoir une extension à la sous-classe se produit avant que la définition de la sous-classe elle-même dans le même fichier semble confondre XCode, malgré la compilation fine; le correctif consistait à placer les extensions après la définition de la sous-classe.

J'ai publié les détails dans une réponse à cette question similaire .

Cora Middleton
la source
2

Dans mon cas, l'initialiseur désigné - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil dans la classe *** ViewController a été implémenté, donc même si lorsque j'appelle un autre initialiseur pour initialiser l'objet, l'initialiseur désigné sera appelé.

Donc, pour résoudre ce problème, vérifier si - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNilc'est également un bon moyen.

lynulzy
la source
2

J'ai rencontré ce problème d'une manière légèrement différente des autres réponses ici.

Si je créais simplement un nouveau fichier xib, y ajoutais un UIViewController dans Interface Builder et que je définissais la classe personnalisée de UIViewController sur mon contrôleur de vue, cela entraînait le blocage de la «sortie de la vue non définie». Les autres solutions ici disent de contrôler-faire glisser la sortie de la vue vers la vue, mais pour moi, la sortie de la vue était grisée et je ne pouvais pas la contrôler-la faire glisser.

la prise de vue grisée

J'ai compris que mon erreur était en ajoutant un UIViewController dans Interface Builder. Au lieu de cela, j'ai dû ajouter une UIView et définir la classe personnalisée du propriétaire du fichier sur mon contrôleur de vue. Ensuite, je pouvais contrôler-faire glisser la sortie de vue du propriétaire du fichier vers ma nouvelle vue UIView et tout fonctionnait comme il se doit.

Brian Kendig
la source
1

Juste eu la même erreur dans mon projet, mais une raison différente. Dans mon cas, j'avais une configuration IBOutlet avec le nom "View" dans ma classe UITableViewController personnalisée. Je savais que "view" était spécial parce que c'est un membre de la classe de base, mais je ne pensais pas que View (cas différent) serait également un problème. Je suppose que certaines zones de Cocoa ne sont pas sensibles à la casse, et le chargement d'un xib est probablement l'une de ces zones. Je viens donc de le renommer en DefaultView et tout va bien maintenant.

eselk
la source
1

sélectionnez le propriétaire des fichiers et allez ouvrir l'inspecteur d'identité donnez le nom de classe auquel il correspond. Si aucune des méthodes ci-dessus ne fonctionne et que vous ne pouvez toujours pas voir la sortie de la vue, donnez une nouvelle connexion de sortie de référence au propriétaire du fichier, vous pouvez alors voir la sortie de la vue. Cliquez sur la vue Outlet pour établir une connexion entre la vue Outlet et le propriétaire du fichier. Exécutez l'application, cela fonctionne bien.

Abhilash Reddy kallepu
la source
1

Dans mon cas, la vue n'a pas été visualisée en xib. en xib, la vue était de taille = aucune (4ème onglet à droite). J'ai défini la taille sur Freeform et rechargé xCode. la vue a été portée en appel et j'ai mis le lien approprié vers la vue.

OrdoDei
la source
1

Si vous avez tout essayé et que vous obtenez toujours cette erreur, essayez de recréer le fichier de classe à partir de zéro, mais n'oubliez pas de cocher la case "Créer également un fichier XIB". Cela reliera automatiquement quelques éléments qui ne sont pas liés lors de la création de ces fichiers séparément. Après cela, vous pouvez probablement tout copier-coller sur le nouveau XIB et cela devrait fonctionner correctement.

Je trouve ce problème spécifiquement avec la création de fichiers séparément dans Swift.

Travis M.
la source
1

pour moi c'est arrivé, quand

  • J'ai une classe ViewController (.mm / h) associée au fichier Nib,
  • UIView de ce ViewController doit être chargé sur l'autre vue en tant que sous-vue,

  • nous appellerons quelque chose comme ça

    -(void)initCheckView{
    
       CheckView *pCheckViewCtrl = [CheckView instance];
    
       pCheckView = [pCheckViewCtrl view];
    
       [[self view]addSubview:pCheckView];
    
       [pCheckViewCtrl performCheck];        
    
    }

+(CheckView *)instance{
    static CheckView *pCheckView = nil;
    static dispatch_once_t checkToken;

    dispatch_once(&checkToken, ^{
        pCheckView = [[CheckView alloc]initWithNibName:@"CheckView" bundle:nil];
        if ( pCheckView){
            [pCheckView initLocal];
            **[pCheckView loadView];**
        }
    });

    return pCheckView;

}

Ici, loadView manquait ,,, l'ajout de cette ligne a résolu mon problème.

Amitg2k12
la source
1

J'ai eu le même problème, j'ai compris et c'est parce que j'avais coché " Cellules statiques " dans les propriétés de la vue Table sous l' option Contenu . A fonctionné quand il est devenu " Dynamic Prototypes". La capture d'écran est ci-dessous. entrez la description de l'image ici

Saranjith
la source
1

J'ai eu un problème similaire avec Xcode 9.3, et la définition de "Module" sous l'inspecteur d'attributs "Propriétaire du fichier" dans le module de projet a résolu ce problème pour moi.

nananta
la source
1

Ouvrez votre fichier de storyboard où votre viewController existe, ou un fichier lié à XIB avec textEdit.app et vérifiez si le storyboard ou le nom XIB est le même que celui de votre viewController, puis changez-le, enregistrez et rechargez / redémarrez Xcode.

Alessandro Ornano
la source
1

Si vous utilisez une méthode d'initialisation personnalisée, vérifiez que vous renvoyez quelque chose de valide. J'ai rencontré un morceau de code qui s'est écrasé sur quelque chose comme ceci:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
   } return self;
}

Dans une autre classe, le contrôleur a été créé comme suit:

CustomController *controller = [[CustomController alloc] init];

Le problème est que dans la méthode init, self n'a pas changé et devrait plutôt ressembler à ceci:

- (id)init {
   self = [super init];
   if (self) {
      CustomController *controller = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(className) owner:self options:nil];
      [controller viewDidLoad];
      self = controller;
   } return self;
}
Declan Land
la source
0

J'aimerais seconder Stephen J. Parfois, X Code ne fait que se confondre. J'ai juste eu une expérience où j'avais beaucoup joué avec l'interface utilisateur, et j'avais ajouté et supprimé des points de vente à plusieurs reprises. Les points de vente ne voulaient tout simplement plus être câblés. Je n'ai jamais trouvé de raison spécifique (j'avais essayé toutes les solutions ci-dessus), et je devais simplement supprimer la NIB et la recréer à partir de zéro, et en fait j'ai dû utiliser un nom différent pour la NIB avant que cela fonctionne. (XCode 4.6.1) J'ai perdu quelques heures à ce sujet.

BrianH
la source