2011-09-30 16 views
14

He creado una categoría para UINavigationBar con el siguiente código:ObjectiveC Categoría no se importa, pero aún la ejecución de código

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

no he import en cualquier lugar, en cualquier parte del código en toda mi proyecto, sin embargo, esta categoría aún se está ejecutando e insertando el gráfico del encabezado. ¿Cómo es esto posible?

Respuesta

24

Porque está incluyendo el código en su aplicación cuando la compila. #import solo hace que el contexto actual (.h o .m) tenga en cuenta los métodos en esa categoría.

Cualquier categoría compilada en su aplicación se cargará en todo momento mientras se ejecuta su aplicación.

Para eliminar la categoría que se agregará a su destino, elimine el archivo de categoría .m de la aplicación Target->Build Phase->Compile Sources.

Suponiendo que desea que ALGUNAS de sus barras de navegación utilicen este código, pero no TODAS ellas, la mejor manera de hacerlo es probablemente subclase UINavigationBar. (Usted querrá llamar [super drawRect:rect] en la subclase, por cierto)

Editar: método alternativo para añadir una imagen a UINavigationBar,

En cualquier controlador de vista que desea que aparezca la imagen, basta con añadir a self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease];viewWillAppear:

+1

'Cualquier categoría compilada en su aplicación se cargará en todo momento mientras se ejecuta su aplicación.' Es bueno saberlo, ¡gracias! – Philip007

Cuestiones relacionadas