L'instanciation de la vue de la plume provoque une erreur

J'ai essayé de créer la sous-class @IBDesignable UIView en suivant ce tutoriel ( lien ). La première vue personnalisée va bien. Mais quand j'essaie de faire un autre, j'ai des erreurs. J'ai d'abord failed to update auto layout status: the agent crashed et Failed to render instance of ... D'une manière ou d'une autre j'ai commencé à être capable de biuld et exécuter le projet avec ces erreurs, mais ensuite j'obtiens une nouvelle erreur – EXC_BAD_ACCESS ... en ligne let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView . Voici toute la méthode:

 func loadViewFromNib() -> UIView { let bundle = NSBundle(forClass: self.dynamicType) let nib = UINib(nibName: "advancedCellView", bundle: bundle) let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView return view } 

Avec le premier UIView personnalisé n'est pas un problème. J'utilise le même code ..

entrez la description de l'image ici

Des idées? Je vous remercie

La méthode loadViewFromNib() vous postz semble correcte, vous obtenez le bundle correctement et spécifiez le nom de la plume en tant que littéral de string, donc il devrait find la plume. Comme quelqu'un l'a remarqué, il y a probablement quelque chose qui ne va pas dans votre configuration de la plume. Voici quelques points à vérifier:

  1. AdvancedCellView doit être défini en tant que class personnalisée propriétaire du file dans l'inspecteur d'identité.
  2. Vérifiez que le module est correct aussi – en général, vous voulez juste qu'il soit vide.
  3. La class personnalisée pour la vue ne doit pas être définie, laissez-la par défaut (UIView). Si vous avez un nom plus descriptif que 'View' dans la barre latérale, c'est probablement faux.
  4. Vérifiez que vous n'avez qu'un object de premier niveau dans la plume. La barre latérale doit ressembler à ceci, sans aucune autre input, lorsque l'arborescence de vue est réduite.

Hiérarchie de la plume avec une seule vue de niveau supérieur

NB Cette réponse est liée au tutoriel auquel l'OP est lié, et pas la seule manière correcte de configurer une plume.

La méthode instantiateWithOwner(options:) renvoie un tableau, pas une vue, donc un UIView forcé vers UIView ne fonctionnera jamais. Au lieu de cela, essayez d' [AnyObject] type réel, [AnyObject] .

Les éléments du tableau correspondent aux objects de niveau supérieur du file nib. La vue qui vous intéresse devrait donc être l'un des éléments du tableau. Étant donné le nom de votre file nib, il est très probable qu'il n'y aura qu'un seul object de premier niveau dans le tableau – la cellule que vous essayez de charger. Assurez-vous qu'il existe un seul object de niveau supérieur dans le file nib et qu'il s'agit bien d'une instance d'une sous-class de UIView .

Notez que votre implémentation est potentiellement inefficace. Si vous chargez plusieurs cellules, vous devez mettre en cache l'instance UINib au lieu d'en créer une nouvelle à chaque fois. Notez que les classs de structure telles que UITableViewController des methods d'logging des plumes qui prennent automatiquement en charge ces détails. Vous n'avez donc pas besoin de le faire vous-même.

Essayez de faire cela à la place. Travaille toujours pour moi:

 let picker = NSBundle.mainBundle().loadNibNamed("advancedCellView", owner: nil, options: nil) let view = picker[0] as! UIView return view 

Faites-moi savoir si cela fonctionne

Je regardais le tutoriel et découvert que si vous sous-classz l'élément View dans votre xib personnalisé, vous obtiendrez l'erreur. Vérifiez que vous avez uniquement défini le "propriétaire du file" sur votre class personnalisée.

entrez la description de l'image ici