2012-12-05 13 views
5

Ho una classe personalizzata UIView chiamata MyView che uso insieme a uno UIViewController configurato tramite lo storyboard. La maggior parte delle proprietà della vista è configurata tramite Interface Builder; Tuttavia, ho bisogno di regolare un paio di immagini di programmazione prima di impostare come sfondi per il mio tasto, in questo modo:Regolazione di UIView dopo il caricamento dallo storyboard

-(void)setupVisuals { 
    UIImage *image = [[UIImage imageNamed:@"myButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)]; 
    // _myButton is an IBOutlet property set through the storyboard: 
    [_myButton setBackgroundImage:image forState:UIControlStateNormal]; 
} 

Il problema è che non riesco a chiamare [self setupVisuals] dal initializer *, perché _myButton è nil a quella volta.

ho risolto il problema con l'aggiunta di questa linea di MyViewController s' viewDidLoad:

[(MyView*)self.view setupVisuals]; 

Con questo richiamo a posto, tutto funziona bene. Tuttavia, questo sembra un work-around, piuttosto che una soluzione a quello che è probabilmente un problema relativamente comune.

Esiste un metodo UIView per ignorare, o qualsiasi altro meccanismo per completare l'inizializzazione di immagini MyView s' senza attingere al meccanismo viewDidLoad:?


* In questo caso, l'inizializzatore è initWithCoder: perché la vista è caricato dal storyboard. Ho verificato che l'inizializzatore venga chiamato correttamente, ma le immagini non sono ancora pronte.

+0

IIRC 'initWithFrame:' ​​viene chiamato anche se si carica da un NIB/XIB. Da lì, dopo una chiamata a 'super', non puoi farlo? Ricordo di avere un problema simile e l'ho risolto, ma non ricordo cosa/come fosse esattamente. –

+0

In questi casi, di solito faccio "inizializzazione" in 'viewWillAppear', ma se c'è un modo più semplice per gestirlo, mi piacerebbe sapere. Fondamentalmente quando la vista è caricata dallo storyboard con tutti i suoi punti vendita intatti? –

+0

Hai provato solo [self.myView setupVisuals] dal metodo viewWillAppear nel tuo viewController? Se hai inizializzato quella vista in IB e l'hai impostata come presa, questo dovrebbe funzionare. –

risposta

2

Sembra che si stia utilizzando correttamente viewDidLoad:. Secondo docs di Apple:

Di solito l'override di questo metodo per eseguire l'inizializzazione aggiuntivo sulle viste che sono stati caricati da file NIB.

Se il vostro obiettivo è quello di incapsulare questa funzionalità a livello UIView, provare layoutSubviews.

Problemi correlati