J'ai une classe appelée MyClass
qui est une sous-classe de UIView
, que je veux initialiser avec un XIB
fichier. Je ne sais pas comment initialiser cette classe avec le fichier xib appeléView.xib
class MyClass: UIView {
// what should I do here?
//init(coder aDecoder: NSCoder) {} ??
}
Réponses:
J'ai testé ce code et cela fonctionne très bien:
Initialisez la vue et utilisez-la comme ci-dessous:
OU
METTRE À JOUR Swift> = 3.x & Swift> = 4.x
la source
var view = MyClass.instanceFromNib()
&self.view.addSubview(view)
par opposition àvar view = MyClass.instanceFromNib
&self.view.addSubview(view())
. Juste une petite suggestion pour améliorer la réponse :)La solution de Sam est déjà excellente, même si elle ne prend pas en compte différents bundles (NSBundle: forClass vient à la rescousse) et nécessite un chargement manuel, c'est-à-dire la saisie de code.
Si vous voulez une prise en charge complète de vos sorties Xib, différents bundles (à utiliser dans les frameworks!) Et obtenir un bel aperçu dans Storyboard, essayez ceci:
Utilisez votre xib comme d'habitude, c'est-à-dire connectez Outlets au File Owner et définissez la classe File Owner sur votre propre classe.
Utilisation: Sous-classez simplement votre propre classe View de NibLoadingView et définissez le nom de la classe sur File's Owner dans le fichier Xib
Aucun code supplémentaire requis plus.
Crédits où le crédit est dû: fourché cela avec des changements mineurs de DenHeadless sur GH. Mon essentiel: https://gist.github.com/winkelsdorf/16c481f274134718946328b6e2c9a4d8
la source
nibSetup
depuisinit?(coder:)
provoquera une récursivité infinie en cas d'incorporationNibLoadingView
dans un XIB..clearColor()
- après l'avoir chargée à partir du Storyboard. Mais cela devrait fonctionner si vous le faites par code après son instanciation. Quoi qu'il en soit, comme dit une approche encore plus élégante est celle basée sur le protocole. Alors bien sûr, voici un lien pour vous: github.com/AliSoftware/Reusable . J'utilise maintenant une approche similaire concernant les UITableViewCells (que j'ai implémentées avant de découvrir ce projet vraiment utile). hth!Depuis Swift 2.0, vous pouvez ajouter une extension de protocole. À mon avis, c'est une meilleure approche car le type de retour est
Self
plutôt queUIView
, donc l'appelant n'a pas besoin de convertir en classe de vue.la source
var myView = nib.instantiate... as! myViewType
Swift 3
(XCode 8.0 beta 6) sans problème. La faute de frappe était làSwift 2
. Pourquoi cela devrait-il être une autre réponse lorsque cette réponse est bonne et que les utilisateurs aimeront probablement rechercher quels sont les changements lorsqu'ils utiliseront XC8Et c'est la réponse de Frederik sur Swift 3.0
la source
Méthode universelle de chargement de la vue depuis xib:
Exemple:
La mise en oeuvre:
la source
Réponse Swift 3: Dans mon cas, je voulais avoir un point de vente dans ma classe personnalisée que je pourrais modifier:
Lorsque dans le .xib, assurez-vous que le champ Classe personnalisée est MyClassView. Ne vous embêtez pas avec le propriétaire du fichier.
Assurez-vous également de connecter la prise dans MyClassView à l'étiquette:
Pour l'instancier:
la source
Swift 4
Ici, dans mon cas, je dois transmettre des données dans cette vue personnalisée, donc je crée une fonction statique pour instancier la vue.
Créer une extension UIView
Créer MyCustomView
Définissez la classe personnalisée sur MyCustomView dans le fichier .xib. Branchez la prise si nécessaire comme d'habitude.
Instancier la vue
la source
la source