#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, но не настолько далеко, чтобы не создать кучу проблем.
Обходной путь, который я сделал, заключался в следующем:
- Создайте переменную BOOL
@property (nonatomic) BOOL didFail;
FALSE
Первым делом установите переменную BOOL вwillViewAppear
- Вызовите метод (внутри
willViewAppear
), который проверяет условие - Если условие не выполняется, установите для переменной BOOL значение
TRUE
- Внутри
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 все именно так, как и должно быть!