Подтвердить что ты не робот

ObjectiveC Категория не импортируется, но все еще работает код

Я создал категорию для UINavigationBar со следующим кодом:

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

У меня нет #import нигде, ни в одном из кода во всем моем проекте, однако эта категория все еще запущена и вставляет графику заголовка. Как это возможно?

4b9b3361

Ответ 1

Потому что вы включаете код в свое приложение, когда компилируете его. #import просто делает текущий контекст (.h или .m) осведомленным о методах в этой категории.

Любая категория, которая скомпилирована в ваше приложение, будет загружаться в любое время, пока ваше приложение будет запущено.

Чтобы удалить категорию из добавленной вами цели, удалите файл категории .m из вашего приложения Target->Build Phase->Compile Sources.

Предполагая, что вы хотите, чтобы некоторые из ваших навигационных панелей использовали этот код, но не ВСЕ, лучший способ сделать это, вероятно, для подкласса UINavigationBar. (Кстати, вы хотите называть [super drawRect:rect] в вашем подклассе)

Изменить: альтернативный способ добавления изображения в UINavigationBar,

В любом контроллере просмотра вы хотите, чтобы изображение появилось, просто добавьте self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"header.png"]] autorelease]; в viewWillAppear: