Personnalisé UIView avec Plume rapide sans l'aide de loadFromNib dans la vue contrôleur
J'ai toujours utilisé le loadNibNamed méthode de chargement des vues personnalisées en vue des contrôleurs, mais maintenant, je vais essayer d'éviter d'appeler cette méthode à l'extérieur de l'affichage personnalisé pour le rendre plus réutilisables, de sorte que si une autre personne utilise mon affichage personnalisé, il a seulement besoin d'instancier la vue sans loadFromNib, par exemple:
var myView: MyView = MyView()
Et l'ajout de ce point de vue à la vue du contrôleur de point de vue, assez, à la vue personnalisée charge de la plume à l'intérieur de lui-même.
Je suis en train de le faire dans Swift, en ObjC j'ai trouvé un code comme celui de cette réponse: UIView et initWithFrame et une PLUME de fichier. Comment puis-je obtenir la PLUME de chargement du fichier?
Mais dans swift je ne peux pas utiliser l'init utilisé dans la réponse:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
//Initialization code.
//
[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
J'ai cette méthode et il se termine par une boucle infinie:
override init(frame: CGRect) {
super.init(frame: frame)
self.loadFromNibNamed("MyView")
}
J'ai aussi essayé d'ajouter un autre point de vue à l'intérieur de Mavue comme un IBOutlet comme les autres réponse dit et en utilisant toutes les inits:
@IBOutlet var view: UIView!
override init() {
super.init()
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}
override init(frame: CGRect) {
super.init(frame: frame)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
NSBundle.mainBundle().loadNibNamed("MediaPlayerView", owner: self, options: nil)
self.addSubview(self.view)
}
Mais quand même eu l'erreur de la boucle infinie.
Je ne peux pas trouver une bonne solution pour cela et c'est me rend fou!! Quelqu'un peut m'aider s'il vous plaît? Merci!
- Est-ce que votre PLUME contenir de vue de la classe
MyView
ouMediaPlayerView
, resp.? Cela pourrait être la raison de la boucle infinie, et je suppose queinit(coder:)
comme la cause.
Vous devez vous connecter pour publier un commentaire.
Je pense que le plus propre approche consiste à pas utiliser la valeur par défaut des initialiseurs, mais en utilisant votre propre comme ceci
De cette façon, lorsque vous êtes à l'instanciation d'ailleurs, vous verrez tout de suite que ce n'est pas seulement la plaine vieux instanciation de certains
UIView
mais qu'il a des effets secondaires (que la vue doit être chargé à partir d'une plume)Je ne suis pas sûr de la
super.init(frame)
appel, il est possible queloadNibNamed
exigera également que pour vous, alors vous pourriez vouloir vérifier queVous obtenez une boucle infinie, car
loadNibNamed(_,owner:,options:)
appeler uninit
, alors essayez de charger de nouveau la plume, et, de nouveau, une sorte de suite... Essayez ceci:Swift 4
Ce que ce code n', est de charger le point de vue de la plume, puis de l'ajouter à une sous-vue à l'intérieur de votre point de vue.
Cela fonctionne également lors de l'ajout de votre point de vue sur un autre xibs, ajouter
@IBDesignable
et qu'il sera disponible