web-dev-qa-db-fra.com

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

J'ai créé une vue dans un xib (avec un indicateur d'activité, une vue de progression et une étiquette). Ensuite, 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 IB, je définis le propriétaire du fichier et affiche l'identité sur MyCustomView et connecte 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 j'exécute l'application, la vue est ajoutée, mais je ne vois pas l'étiquette, la barre de progression et l'indicateur d'activité.

Qu'est-ce que je fais mal?

61
Sefran2

Vous devez le charger en utilisant la méthode -loadNibNamed. -initWithNibName Est réservé aux UIViewControllers.

Ajoutez le code suivant à votre méthode d'initialisation MyCustomView:

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

N'oubliez pas que si vous initialisez un objet à partir d'une plume, il appelle - (id)initWithCoder:(NSCoder *)aDecoder pour initialiser, vous devrez donc le remplacer si vous créez l'objet MyCustomView dans la plume. Si vous le faites simplement avec initWithFrame:, Remplacez simplement cela et ajoutez le code ci-dessus. De plus, dans votre nib, assurez-vous que vous avez un UIView de niveau supérieur et placez tous les autres éléments à l'intérieur (cela garantit que votre subviewArray n'a qu'une seule entrée).

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

131
Ned

Je pense que vous devez utiliser cette méthode:

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

C'est parce que vous devez lui passer le nom de fichier .xib dans le "nibNameOrNil".

1
hocker

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

Ensuite, vous devez contrôler cette liste:

  • Ouvrez le fichier .xib dans IB
  • Cliquez sur File Owner et sélectionnez la bonne classe (MyCustomView dans votre cas)
  • Maintenez la commande enfoncée et faites glisser du propriétaire du fichier vers la vue (maintenant la sortie de la vue est correcte)

Esperons que ça marche. À votre santé.

0
Lorenzo B