2011-09-30 16 views
14

Ho creato una categoria per UINavigationBar con il seguente codice:ObjectiveC categoria non viene importata, ma ancora in esecuzione il codice

// UINavigationBar+MyNavigationBar.m 
@interface UINavigationBar (MyNavigationBar) 

@end 

@implementation UINavigationBar (MyNavigationBar) 

- (void)drawRect:(CGRect)rect 
{ 
    UIImage *img = [UIImage imageNamed: @"header.png"]; 
    [img drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 
} 

@end 

non ho #import ovunque, in qualunque parte del codice in tutta la mia progetto, tuttavia, questa categoria è ancora in esecuzione e inserisce la grafica dell'intestazione. Com'è possibile?

risposta

24

Perché stai includendo il codice nella tua app quando lo compili. #import rende solo il contesto corrente (.h o .m) consapevole dei metodi in quella categoria.

Qualsiasi categoria che viene compilata nella tua app verrà caricata in qualsiasi momento mentre la tua app è in esecuzione.

Per rimuovere la categoria dall'aggiunta al target, rimuovere il file .m della categoria dall'app Target->Build Phase->Compile Sources.

Supponendo che ALCUNE delle barre di navigazione utilizzino questo codice, ma non TUTTI, il modo migliore per farlo è probabilmente creare una sottoclasse di UINavigationBar. (Ti consigliamo di chiamare [super drawRect:rect] nella sottoclasse, tra l'altro)

Edit: metodo alternativo di aggiungere un'immagine per UINavigationBar,

In ogni controller della vista che si desidera visualizzare l'immagine, basta aggiungere alla self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease];viewWillAppear:

+1

'Ogni categoria che viene compilata nella tua app verrà caricata in qualsiasi momento mentre la tua app è in esecuzione.' Buono a sapersi, grazie! – Philip007

Problemi correlati