61 votes

Ajout d'une sous-vue personnalisée (créée dans un xib) à la vue d'un contrôleur de vue - Qu'est-ce que je fais mal ?

J'ai créé une vue dans un xib (avec un indicateur d'activité, une vue de progression et une étiquette). Puis j'ai créé des fichiers .h/.m :

#import <UIKit/UIKit.h>

@interface MyCustomView : UIView {
    IBOutlet UIActivityIndicatorView *actIndicator;
    IBOutlet UIProgressView *progressBar;
    IBOutlet UILabel *statusMsg;
}

@end

#import "MyCustomView.h"

@implementation MyCustomView    

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Initialization code
    }
    return self;
}

- (void)dealloc {
    [super dealloc];
}

@end

Dans l'IB, j'ai défini le propriétaire du fichier et l'identité de la vue sur MyCustomView et j'ai connecté l'IBOutlet au propriétaire du fichier.

Dans MyViewController.m, j'ai :

- (void)viewDidLoad {

    [super viewDidLoad];   

    UIView *subView = [[MyCustomView alloc] initWithFrame:myTableView.frame];
    [subView setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]];

    [myTableView addSubview:subView];
    [subView release];
}

Lorsque je lance l'application, la vue est ajoutée, mais je ne peux pas voir l'étiquette, la barre de progression et l'indicateur d'activité.

Qu'est-ce que je fais de mal ?

131voto

Ned Points 3178

Vous devez le charger en utilisant l'option -loadNibNamed méthode. -initWithNibName est uniquement pour les UIViewControllers.

Ajoutez le code suivant à la méthode init de votre MyCustomView :

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"MyCustomView" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];
[self addSubview:mainView];

Rappelez-vous, si vous initialisez un objet à partir d'une nib, il appelle - (id)initWithCoder:(NSCoder *)aDecoder pour l'initialiser, vous devrez donc la remplacer si vous créez l'objet MyCustomView dans la Nib. Si vous le faites simplement avec initWithFrame: alors il suffit de passer outre et d'ajouter le code ci-dessus. De plus, dans votre base de données, assurez-vous d'avoir un UIView de niveau supérieur et placez tous les autres éléments à l'intérieur de celui-ci (cela garantit que votre subviewArray n'a qu'une seule entrée).

Cela chargera les vues de la plume et les ajoutera à l'objet, ce qui devrait faire l'affaire.

11voto

Flow Points 698

J'ai trouvé ces deux articles très utiles pour le chargement de vues personnalisées à partir de xibs.

5 approches pour charger UIView depuis Xib

La façon la plus simple de charger UIView à partir de fichiers Xib

1voto

hocker Points 181

Je pense que vous devez utiliser cette méthode :

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

En effet, vous devez lui transmettre le nom du fichier .xib dans le champ "nibNameOrNil".

0voto

flexaddicted Points 16208

Comme l'a dit Hocker, vous devez utiliser cette méthode en passant par le nom du XIB (sans l'extension).

Ensuite, vous devez contrôler cette liste :

  • Ouvrez le fichier .xib dans l'IB
  • Cliquez sur Propriétaire du fichier et sélectionnez la classe correcte (MyCustomView dans votre cas).
  • Maintenez le contrôle enfoncé et faites glisser du propriétaire du fichier vers la vue (maintenant la sortie de la vue est correcte).

J'espère que cela fonctionnera. A la vôtre.

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