#iphone #objective-c #global-variables #viewwillappear
#iPhone #objective-c #глобальные переменные #viewwillappear
Вопрос:
У меня есть контроллер панели вкладок с некоторым элементом панели вкладок в нем.
При первом нажатии пользователем на элемент панели вкладок я хочу, чтобы открывался alertview, чтобы пользователь мог прочитать несколько небольших подсказок по инструкции.
У меня есть глобальная переменная (скажем, CONFIG), которая содержит некоторые логические значения valeus (CONFIG.tip1AlreadySeen, CONFIG.tip1AllreadySeen и т.д.). Все эти логические значения инициализируются значением NO.
Когда пользователь нажимает на элемент панели вкладок, выполняется метод viewWillAppear в его viewcontroller. В этом методе я ввел код, подобный этому:
-(void) viewVillAppear: (BOOL) animated {
extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used
[super viewWillAppear: animated];
if(CONFIG.tip1AlreadySeen == NO) {
CONFIG.tip1AlreadySeen = YES;
// code for showing the alertview
}
}
Странно то, что этот фрагмент кода отлично работает в одном viewcontroller, но не работает ни в одном другом.
После некоторой отладки я обнаружил, что в другом viewcontroller код выполняется, но присвоение CONFIG.tipAlreadySeen = YES не изменяет фактическое значение CONFIG.tipAlreadySeen. Это значение по-прежнему равно NO. Невероятно!!!
Небольшим обходным решением было использование метода viewDidAppear для изменения значения:
-(void) viewVillAppear: (BOOL) animated {
extern CONFIG; // <- it's not the actual code but it indicates that a global variable must be used
[super viewWillAppear: animated];
if(CONFIG.tip1AlreadySeen == NO) {
// code for showing the alertview
}
}
-(void) viewDidAppear: (BOOL) animated {
extern CONFIG;
CONFIG.tip1AlreadySeen = YES;
}
…Но я действительно не понял, что произошло!!! Кто-нибудь из вас мог бы объяснить это поведение?
Заранее спасибо!
Марко
Ответ №1:
Почему это должно быть глобальным и не содержаться в самом контроллере представления? Просто BOOL
свойство @ на вашем контроллере просмотра, которое переключается. И, чтобы поддерживать это постоянным при нескольких запусках вашего приложения, сохраните результат в NSUserDefaults, который вы, в свою очередь, проверяете каждый раз при инициализации вашего view controller.
Комментарии:
1. В данном конкретном случае вы правы: мне не нужна была глобальная переменная. Но чтобы сохранить постоянство при нескольких запусках моего приложения, я создал глобальную конфигурацию объекта, которая записывается на диск, когда пользователь выходит из приложения (с помощью NSKeyedArchiver). Я еще не пробовал использовать NSUserDefault, я посмотрю. Но мой вопрос все еще остается: почему в одном viewcontroller назначение CONFIG.tip1AlreadySeen = YES, а в некоторых других viecontrollers это не так?