2013-02-28 9 views
13

Ho un UIView sul builder dell'interfaccia. Nel mio controller di visualizzazione ho uno IBOutlet MyUIView che punta allo UIView sul builder dell'interfaccia.Suddivisione di un UIView. il metodo init non viene mai chiamato

ho cambiato la classe del UIView a "MyUIView" (classe UIView personalizzato), ma sembra che nessuno dei init metodi della sottoclasse sono licenziato.

Cosa sto sbagliando?

+1

potresti mostrare il tuo codice come lo fai? – nsgulliver

+0

Niente di veramente nel codice! Nel builder dell'interfaccia seleziono la visione UIV e imposta la classe su "ShadowView". Ho inserito i breakpoint nel metodo di inizializzazione di ShadowView ma non è mai entrato in questi metodi. –

risposta

25

Invece di init è necessario chiamare initWithCoder prima quindi chiamare init come:

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super initWithCoder:aDecoder])) { 
     [self baseClassInit]; 
    } 
    return self; 
} 

- (void)baseClassInit { 

    //initialize all ivars and properties  
} 
+0

Grazie controllerò! –

+0

È inoltre necessario * implementare * 'initWithCoder:', come fa quel codice. Semplicemente chiamandolo da un posto casuale mentre l'override di 'init' da solo non farà il lavoro. –

20

Risposta breve: è necessario utilizzare initWithCoder:.

Dalle initWithFrame: documentazione:

Se si utilizza Interface Builder per progettare l'interfaccia, questo metodo non viene chiamato quando gli oggetti vista sono successivamente caricati dal file pennino. Gli oggetti in un file pennino vengono ricostituiti e quindi inizializzati utilizzando il loro initWithCoder: metodo, che modifica gli attributi della vista in modo che corrispondano agli attributi memorizzati nel file pennino.

Se si utilizza un file pennino/xib/Storyboard, utilizzare initWithCoder:. Se stai creando la tua vista a livello di programmazione, puoi utilizzare init o initWithFrame:.

Problemi correlati