web-dev-qa-db-fra.com

Instancier la vue depuis la plume génère une erreur

J'ai essayé de créer la sous-classe @IBDesignable UIView en suivant ce tutoriel ( link ). La première vue personnalisée va bien. Mais quand j'essaye d'en créer un autre, j'ai des erreurs. J'ai d'abord eu 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 lancer et d'exécuter un projet avec ces erreurs, mais j'ai alors une nouvelle erreur - EXC_BAD_ACCESS ... sur la ligne 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 la première personnalisation, UIView ne pose aucun problème. J'utilise le même code ..

 enter image description here

Des idées? Je vous remercie

16
Lachtan

La méthode loadViewFromNib() que vous publiez semble bien, vous obtenez le paquet correctement et vous spécifiez le nom du nib en tant que littéral de chaîne. Le nib doit donc être trouvé. Comme quelqu'un d'autre l'a commenté, il y a probablement quelque chose qui ne va pas dans la configuration de la plume. Voici quelques points à vérifier:

  1. AdvancedCellView doit être défini comme classe personnalisée du propriétaire du fichier dans l'inspecteur d'identité.
  2. Vérifiez que le module est également correct - en règle générale, vous souhaitez simplement le laisser vide.
  3. La classe personnalisée pour la vue ne doit pas être définie, laissez-la simplement comme valeur par défaut (UIView). Si vous avez un nom plus descriptif que "View" dans la barre latérale, il est probablement faux.
  4. Vérifiez que vous n’avez qu’un seul objet de niveau supérieur dans la plume. La barre latérale doit ressembler à ceci, sans aucune autre entrée, lorsque l'arborescence de la vue est réduite.

 Nib hierarchy with only one top level view

N.B. Cette réponse est liée au didacticiel auquel l'OP est lié et n'est pas la seule façon correcte de configurer une nib.

40
Josh Heald

La méthode instantiateWithOwner(options:) renvoie un tableau et non une vue. Par conséquent, un downcast forcé vers UIView ne fonctionnera jamais. Essayez plutôt de transtyper le type actuel, [AnyObject].

Les éléments du tableau correspondent aux objets de niveau supérieur du fichier nib. La vue qui vous intéresse doit donc être l’un des éléments du tableau. Étant donné le nom de votre fichier nib, il est fort probable qu'il n'y aura qu'un seul objet de niveau supérieur dans le tableau, la cellule que vous essayez de charger. Assurez-vous qu'il n'y a qu'un seul objet de niveau supérieur dans le fichier nib et qu'il s'agit bien d'une instance d'une sous-classe 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 classes de structure telles que UITableViewController ont des méthodes intégrées pour l’enregistrement des nibs qui gèrent automatiquement ces informations. Vous n’avez donc peut-être pas besoin de le faire vous-même.

2
jlehr

Je regardais le didacticiel et découvris que si vous sous-classiez l'élément View dans votre xib personnalisé, vous obtiendrez l'erreur. Assurez-vous que vous avez uniquement défini le "Propriétaire du fichier" dans votre classe personnalisée.

 enter image description here

1
B-Rad

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

1
brl214