Domanda

Ho creato una sottoclasse UIView associata al file .xib. Questa sottoclasse UIView deve essere utilizzata in un UIViewController. Nel controller, penso che ci siano due opzioni come istanziare la sottoclasse UIView:

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

e

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

Preferisco il primo approccio o le sue varianti che mi consentono di eseguire l'inizializzazione personalizzata. L'unico problema è che devo specificare un frame rect, che era già stato specificato in.xib (intendo l'altezza e la larghezza del fotogramma del MyUIView). Sì, posso hardcoderlo di nuovo in aRect, ma questo è noioso da mantenere (ad esempio, quando cambio la posizione di UIS in .xib, devo aggiornare aRect, anche).

Quindi il secondo approccio dovrebbe entrare in mente mentre il telaio RT viene impostato automaticamente. Il problema rimanente non posso personalizzare l'inizializzatore (dire, voglio passare parametri aggiuntivi durante l'inizializzazione).

Qual è la tua preferenza? Quale è migliore secondo te?

Edit1: Ispirato dalla risposta di Sergio, sono uscito con questa soluzione alternativa:

// 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;
}
.

È stato utile?

Soluzione

Hai provato ad usare:

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

Non so se funziona nel tuo caso (caricando la vista da un pennino), ma lo uso correttamente quando creo la mia visualizzazione personalizzata.

Puoi provarlo.

Modifica:

È possibile definire il tuo metodo init per la tua visualizzazione:

-(id)initWithPosition:(CGPoint)pos;
.

e quindi chiamare:

-(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

  }
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top