Рисование изображения на панели навигации и проверка наличия некоторого глобального bool, если рисовать

#iphone #objective-c #ios

#iPhone #objective-c #iOS

Вопрос:

Я могу нарисовать изображение на панели навигации, добавив его в нижнюю часть моего класса delegate.m .

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

Пока это работает отлично, но я хотел бы иметь некоторый глобальный BOOL var, который я мог бы установить из всех моих других ViewControllers, чтобы я мог менять панель навигации, когда это необходимо.

Кто-нибудь знает хорошее решение? Есть ли способ установить некоторую глобальную переменную, которую могут видеть все классы, и на которую я могу ссылаться с помощью вышеуказанного метода?

Приветствия, -Code

Ответ №1:

Предполагая, что у вас есть глобальный bool в вашем делегате приложения

 @property (nonatomic, assign) BOOL globalBool;
  

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

 id appDelegate = [[UIApplication sharedApplication] delegate];

BOOL gloBalBool = [appDelegate globalBool];
  

и установите глобальную переменную bool

 [appDelegate setGlobalBool:YES];
  

Комментарии:

1. Можно ли увидеть AppDelegate с помощью фрагмента кода, который я опубликовал. Не требуется ли #include класса appdelegate. И может ли это быть включено в код, который я добавил к вопросу? Я использовал AppDelegate, который вы показали выше, в других приложениях, но я не думал, что это возможно в моем случае здесь.

2. я не понял вашего комментария

Ответ №2:

используйте одноэлементный элемент, который мне очень помог, используя их, это выглядело бы примерно так:

GlobalSingelton.h:

 @interface GlobalSingelton : NSObject

 (GlobalSingelton *)sharedInstance;
@property (nonatomic, assign) BOOL globalBool;
@end
  

GlobalSingelton.m:

 #import "GlobalSingelton.h"

@implementation GlobalSingelton
@synthesize globalBool;

static GlobalSingelton *sharedInstance;

  (LocationController *)sharedInstance {
@synchronized(self) {
    if (!sharedInstance)
        sharedInstance=[[GlobalSingelton alloc] init];       
}
return sharedInstance;
}


-(id) init {
if (self = [super init]) {
    self.globalBool = NO;
}
return self;
}
@end
  

И тогда вы можете вызвать этот синглтон в любом месте, где захотите..

Я сам не тестировал, но это идея синглтона.

Удачи!

Комментарии:

1. Опять же, я смотрю на code snipper, который находится в нижней части моего appdelegate, нужно ли мне добавлять #include «GlobalSingelton.h» сразу после @implementaion ?

2. @code Я тоже всегда удивляюсь этому. Как я должен получить доступ к bool из других файлов? Должен ли я написать self.globalBool или [[GobalSingleton sharedInstance]globalBool] = ДА?

3. Я рекомендовал не использовать точечную нотацию, так как иногда бывает трудно увидеть свойство только для чтения, и вы можете узнать это, только если у вас нет установщика, как в [[GlobalSingleton sharedInstance] setGlobalBool:ДА]

Ответ №3:

Вы можете использовать пользовательские настройки по умолчанию:

 [[NSUserDefaults standardUserDefaults] setValue:NO
                             forKey:@"globalBool"];
  

а затем доступ к нему из любого места:

 [[[NSUserDefaults standardUserDefaults] valueForKey:@"globalBool"] boolValue];
  

Комментарии:

1. Будет ли доступ к этому при каждом вызове drawRect для панели навигации приводить к значительному снижению производительности?

2. вы можете сохранить локальный экземпляр globalBool и обновить его как viewWillAppear, если это вызывает проблемы с производительностью.