Странное поведение в viewWillAppear

#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 это не так?