web-dev-qa-db-fra.com

UIView personnalisé ajouté dans le générateur d'interface ne charge pas le xib

J'ai créé un UIView personnalisé avec un xib.

De plus, j'ai un UIViewController dans mon storyboard, auquel j'ai ajouté un UIView et défini sa classe pour être mon UIView personnalisé.

Mais lorsque j'exécute l'application, la vue n'a pas ses sous-vues. Lorsque je débogue, toutes les sous-vues sont nulles.

Dans .m du UIView personnalisé, ces méthodes init sont présentes:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {

    }
    return self;
}

Qu'est-ce que je rate?

23
Luda

Comme vous le savez déjà, avec un UIViewController nous avons le -initWithNibName:bundle: méthode pour le connecter à un xib.
Mais...
Lorsqu'il s'agit d'un UIView, vous devez utiliser -loadNibNamed:owner:options: et chargez-le avec le xib. ( simplement spécifier une classe personnalisée à la vue dans le xib ne fonctionnera pas)


Supposer:

  1. Création d'une sous-classe UIView appelée CustomXIBView
    • ( Nouveau fichier> Cocoa Touch> Classe Objective-C - Sous-classe de UIView)
  2. A créé une interface utilisateur Simple View et l'a nommée CustomXIBView
    • ( Nouveau fichier> Interface utilisateur> Afficher)

Pas:

  1. Accédez à la plume de CustomXIBView
  2. Sélectionnez View ( barre d'outils gauche)
  3. Sélectionnez Show Identity Inspector ( 3e option dans le panneau de droite)
  4. Spécifiez CustomXIBView comme classe personnalisée de View
    • ne faites rien avec CustomXIBView's File's Owner dans la plume
  5. Faites glisser Drop Objects et connectez-le avec CustomXIBView.h

Code:

//To load `CustomXIBView` from any `UIViewController` or other class: 
//instead of the following commented code, do the uncommented code
//CustomXIBView *myCustomXIBViewObj = [CustomXIBView alloc] init];
//[myCustomXIBViewObj setFrame:CGRectMake(0,0,320,480)];

//Do this:
CustomXIBView *myCustomXIBViewObj = 
     [[[NSBundle mainBundle] loadNibNamed:@"someView"
                                    owner:self
                                  options:nil]
                            objectAtIndex:0];
[myCustomXIBViewObj setFrame:CGRect(0, 
                                    0, 
                                    myCustomXIBViewObj.frame.size.width, 
                                    myCustomXIBViewObj.frame.size.height)];
[self.view addSubview:myCustomXIBViewObj];

réf: http://eppz.eu/blog/uiview-from-xib/

32
staticVoidMan