#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, если это вызывает проблемы с производительностью.