Оттенок кнопки меняет цвет при использовании popViewControllerAnimated

#ios #objective-c #uistoryboard #popviewcontrolleranimated

#iOS #objective-c #uistoryboard #popviewcontrolleranimated

Вопрос:

В представлении # 1 у меня есть два элемента управления, которые установлены в раскадровке; один — UIBarButtonItem на панели навигации, другой — UISegmentedController. Первое — это пользовательское изображение, и для обоих элементов задан оттенок фиолетового цвета (оттенок задан в инспекторе атрибутов раскадровки).

С помощью различных действий пользователь может перейти к просмотру # 2 через просмотр # 1. Если определенное условие не выполняется при просмотре # 2, пользователю отображается сообщение об ошибке, и он перенаправляется обратно на просмотр # 1 после нажатия кнопки «ОК».

Соответствующий код:

 if(i == [self.itemsAvailable count]){
    UIAlertView *alertView = [[UIAlertView alloc] 
                    initWithTitle:@"Oh no!" 
                    message:@"Warning message text!" 
                    delegate:self 
                    cancelButtonTitle:@"OK" 
                    otherButtonTitles:nil, nil];

    [alertView show];

    break;
}
  

Обратите внимание, что предупреждение запускается внутри while цикла, следовательно break; . Затем следующая функция возвращается к просмотру # 1

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == [alertView cancelButtonIndex]) {
        // Jump back one screen
        [self.navigationController popViewControllerAnimated:YES];
    }
}
  

Дело в том, что когда я возвращаюсь к просмотру # 1 с помощью popViewControllerAnimated:YES функции, два элемента управления, упомянутые ранее (UIBarButtonItem и UISegmentedController), имеют свои оттенки, отображаемые как серые, вместо желаемого фиолетового.

Выбор другого значения UISegmentedController возвращает соответствующий цвет оттенка, но мне нужно оставить View # 1, чтобы UIBarButtonItem вернулся к правильному фиолетовому оттенку.

Почему цвета оттенков меняются, и как я могу исправить эту проблему, чтобы они автоматически имели соответствующие цвета оттенков при возврате к просмотру # 1?

Примечание:

Вид # 1 имеет следующую viewWillAppear функцию

 - (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];

    // Unhide the nav bar (hidden on home screen)
    [self.navigationController.navigationBar setHidden:NO];

    [self setUserDefaults]; // Load the appropriate values and set in UISegmentedController
}
  

где

 - (void) setUserDefaults {

    // Set the defaults from the settings
    int selectedValue;

    selectedValue = (int)[self.userDefaults integerForKey:@"SomeValue"];        

    [self.defaultsSegment setSelectedSegmentIndex:selectedValue];
}
  

Некоторые имена переменных были изменены, а некоторый код был опущен, но это важные части. Я не верю, что функция имеет какое-либо отношение к неправильному цвету оттенка, потому что UIBarButtonItem никогда не изменяется с помощью кода и показывает ту же ошибку, что и UISegmentedController.

Редактировать # 1:

Добавление строки [self loadView]; в viewWillAppear метод исправляет цвет оттенка UISegmentedController, но я пока не могу понять, как исправить проблему с оттенком UIBarButtonItem. Использование строки [self.navigationController loadView]; вызывает целый ряд проблем.

Редактировать # 2:

Вызывается UIAlertView внутри метода, который сам вызывается из viewWillAppear . Если я перемещу вызов метода viewDidAppear , то UIBarButtonItem он сохранит свой правильный цвет оттенка. Но затем графика в представлении внезапно появляется ПОСЛЕ завершения загрузки представления, что выглядит неприглядно.

Ответ №1:

Причина проблем заключается в том, что popViewControllerAnimated был вызван до завершения загрузки представления.

Это выглядело так…

Внутри viewWillAppear метода был вызов другого метода, который проверял условие и решал, открывать ли одно представление или нет. Все это произошло до того, как представление даже завершило загрузку, и именно здесь возникла проблема.

Попробуйте поместить это в View # 2, а затем перейти к нему из View # 1:

 - (void)viewWillAppear:(BOOL)animated{
{
    [super viewWillAppear:animated];
    [self.navigationController popViewControllerAnimated:YES];
}
  

Код будет скомпилирован просто отлично, но когда вы перейдете к просмотру # 2, вы получите следующий журнал:

"nested pop animation can result in corrupted navigation bar"

И, по сути, это проблема, с которой я столкнулся, когда цвета оттенков менялись после всплывающего окна. Метод popViewControllerAnimated был достаточно глубок в коде, чтобы его не перехватил Xcode, но не настолько далеко, чтобы не создать кучу проблем.

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

  1. Создайте переменную BOOL @property (nonatomic) BOOL didFail;
  2. FALSE Первым делом установите переменную BOOL в willViewAppear
  3. Вызовите метод (внутри willViewAppear ), который проверяет условие
  4. Если условие не выполняется, установите для переменной BOOL значение TRUE
  5. Внутри viewDidAppear проверьте, является ли переменная BOOL истинной или нет. Откройте одно представление, если условие — это то, что вы ищете.

код:

.h файл

 @property (nonatomic) BOOL didFail;
  

.m файл

 - (void)viewWillAppear:(BOOL)animated{
{
    [super viewWillAppear:animated];
    self.didFail = FALSE;

    [self methodCall];
}

- (void) methodCall
{
    if(condition is met){
        self.didFail = TRUE;
    }
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if(self.didFail == TRUE){
        //alert message
        [self.navigationController popViewControllerAnimated:YES];
    }
}
  

И это будет сделано. Перед отображением предупреждения возникает небольшая пауза, но она незначительна. И теперь после pop все именно так, как и должно быть!