2011-09-30 25 views
14

ja stworzyliśmy kategorię UINavigationBar z następującego kodu:ObjectiveC Kategoria nie jest importowana, ale nadal działa kod

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

Nie #import nigdzie, w żadnym kodem w moim całego projektu, jednak ta kategoria nadal działa i wstawia grafikę nagłówka. Jak to jest możliwe?

Odpowiedz

24

Ponieważ kod jest dołączany do aplikacji podczas jej kompilacji. #import powoduje, że obecny kontekst (.h lub .m) jest świadomy metod z tej kategorii.

Każda kategoria wkompilowana w aplikację będzie ładowana przez cały czas, gdy aplikacja jest uruchomiona.

Aby usunąć kategorię z dodawania do celu, usuń plik kategorii .m ze swojej aplikacji Target->Build Phase->Compile Sources.

Zakładając, że chcesz NIEKTÓRE z twoich pasków nawigacyjnych używać tego kodu, ale nie wszystkie z nich, najlepszym sposobem na to jest prawdopodobnie do podklasy UINavigationBar. (Będziemy chcieli zadzwonić [super drawRect:rect] w podklasie, nawiasem mówiąc)

EDIT: alternatywną metodę dodawania obrazu do UINavigationBar,

W każdym kontrolerze widok, który ma się pojawić obraz, wystarczy dodać do self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease];viewWillAppear:

+1

"Każda kategoria, która jest wkompilowana w Twoją aplikację, będzie ładowana przez cały czas, gdy aplikacja jest uruchomiona." Dobrze wiedzieć, thx! – Philip007

Powiązane problemy