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 ..
Des idées? Je vous remercie
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:
AdvancedCellView
doit être défini comme classe personnalisée du propriétaire du fichier dans l'inspecteur d'identité.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.
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.
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