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 ..
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:
AdvancedCellView
doit être défini en tant que class personnalisée propriétaire du file dans l'inspecteur d'identité.
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.