113 votes

Comment charger un fichier xib dans une UIView ?

J'ai cherché partout et rien n'a fonctionné pour moi jusqu'à présent.

En gros, je veux avoir un fichier .xib appelé rootView.xib et à l'intérieur de celui-ci je veux avoir une UIView (appelons-la containerView) qui ne prend que la moitié de l'écran (il y aurait donc la vue normale et une nouvelle vue). Ensuite, je veux un fichier .xib différent appelé firstView.xib et le charger à l'intérieur de containerView. Ainsi, je peux avoir un tas de choses sur firstView.xib et un tas de choses différentes dans rootView.xib et charger mon firstView.xib à l'intérieur de containerView dans rootView.xib, mais comme il ne prend que la moitié de l'écran, vous verrez toujours les choses sur rootView.xib.

5voto

Noshaid Ali Points 105

Para Swift 4.2

Supposons que vous ayez une classe nommée NibView et le fichier nib associé est NibView.xib

class NibView: UIView {

    class func getScreen() -> NibView {
        let xib = Bundle.main.loadNibNamed(String(describing :self), owner: self, options: nil)
        let me = xib![0] as! NibView
        return me
    }

}

créez une instance de la classe et ajoutez-y votre vue avec la mise en page que vous souhaitez.

let myView = NibView.getScreen()
self.yourView.addSubview(myView)

4voto

raed Points 1933

Pour le martinet 3 et 4

let customView = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil)?.first as? CustomView

2voto

Joe Blow Points 3618

NOTE -- cette AQ est ancienne.

Pour aujourd'hui (2014+), il suffit d'utiliser vues des conteneurs qui sont désormais la "façon de tout faire" dans iOS.

Tutoriel ... http://stackoverflow.com/a/23403979/294884

Réponse originale...


Si vous voulez créer un UIView personnalisé (par exemple HandyView) et vous voulez pouvoir le placer dans n'importe quel XIB dans votre projet.

Voici un très simple qui fonctionne dans de nombreux cas.

Créez HandyView.m et HandyView.h. Dans le fichier .h, indiquez

@property (nonatomic, strong) IBOutlet UIView *temp;

Créez un XIB vide appelé HandyView.xib, et placez-y une UIView. Dans le XIB créer le propriétaire du fichier "HandyView". . (Laissez la vue dans la classe "UIView".) Ajoutez autant de contrôles que vous le souhaitez, et ajoutez des IBOutlets pour ceux-ci dans HandyView.h de la manière habituelle.

Dans le fichier .m...

-(void)awakeFromNib
    {
    [[NSBundle mainBundle] loadNibNamed:@"HandyView" owner:self options:nil];
    self.temp.frame = self.bounds;
    [self addSubview:self.temp];

    [super awakeFromNib];
    }

Dans le XIB "HandyView", il obéira aux "ressorts et barres", etc. de la manière habituelle.

(Il est à noter que "HandyView" n'est sans doute pas le meilleur nom pour ce XIB, car il ne s'agit pas d'un HandyView, mais d'une vue que HandyView charge "QUI DEVIENT" (effectivement) HandyView. Vous pouvez préférer un nom comme "HandyViewGuts.xib").

Vous pouvez maintenant utiliser "HandyView" de manière "normale" dans n'importe quel XIB de votre application .

Sur n'importe quel xib, il suffit de glisser un UIView, et de changer la classe en "HandyView". Redimensionnez-le ou n'importe quoi d'autre, et au moment de l'exécution, il fonctionnera comme vous vous y attendez.

Inconvénient : disons que vous avez une instance de HandyView, xxx. Si, dans un autre code, vous faites référence à xxx.view, il s'agit en fait de la vue principale "enveloppante" de HandyView - ce n'est pas "le" HandyView dans votre XIB. (Toutes les autres sorties, etc. de HandyView fonctionnent normalement.) Si vous redimensionnez souvent la vue pour une raison quelconque, vous risquez de vous retrouver dans l'embarras.

J'espère que cela aidera quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X