Question

J'ai créé une sous-classe UIView associée au fichier .xib.Cette sous-classe UIView doit être utilisée dans un UIViewController.Dans le contrôleur, je pense qu'il existe deux options pour instancier la sous-classe UIView :

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];

et

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 

Je préfère la première approche ou ses variantes qui me permettent d'effectuer une initialisation personnalisée.Le seul problème est que je dois spécifier le rect d'un cadre, qui a déjà été spécifié dans .xib (Je veux dire la hauteur et la largeur du cadre de MyUIView).Oui, je peux le coder à nouveau en dur dans aRect, mais c'est fastidieux à maintenir (par exemple, lorsque je change la position des interfaces utilisateur dans .xib, je dois mettre à jour aRect, aussi).

La deuxième approche devrait donc venir à l’esprit car le frame rect est automatiquement défini.Le problème restant est que je ne peux pas personnaliser l'initialiseur (par exemple, je souhaite transmettre des paramètres supplémentaires lors de l'initialisation).

Quelle est votre préférence ?Lequel est le meilleur selon vous ?

EDIT1 :Inspiré par la réponse de Sergio, j'ai proposé cette solution de contournement :

// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];

// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                              owner:self 
                                            options:nil] lastObject]; 
        [self setFrame:CGRectMake(frame.origin.x, 
                                  frame.origin.y, 
                                  [self frame].size.width, 
                                  [self frame].size.height)]; 
        // frame's width and height already determined after 
        // loadNibNamed was called
       ...
    }
    return self;
}
Était-ce utile?

La solution

Avez-vous essayé d'utiliser :

MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];

Je ne sais pas si cela fonctionne dans votre cas (chargement de la vue depuis une plume), mais je l'utilise avec succès lorsque je crée ma vue personnalisée par programme.

Vous pouvez essayer.

MODIFIER:

tu pourrais définir le tien init méthode pour votre point de vue :

-(id)initWithPosition:(CGPoint)pos;

puis appelle :

-(id)initWithPosition:(CGPoint)pos {

  if (self = [super initWithFrame:{pos,{0,0}}]) {
    self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                          owner:self 
                                        options:nil] lastObject]; 
    [self setFrame:CGRectMake(frame.origin.x, 
                              frame.origin.y,  
                              [self frame].size.width,    
                              [self frame].size.height)]; 
     // frame's width and height already determined 
     // after loadNibNamed was called

  }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top