Навигационный стек становится непригодным после отмены iOS 7 назад
Я столкнулся с проблемой, когда мой контроллер навигации становится непригодным после запуска, а затем отменяет новый жест жесткого диска iOS 7.
Некоторая релевантная информация:
- У моего приложения есть домашняя страница с различными страницами активности.
- Домашняя страница скрывает панель навигации в представленииWillAppear
-
Домашняя страница не скрывает панель навигации в представленииWillDisappear
-(void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// Let hide the navbar when we show the home view
[self.navigationController setNavigationBarHidden:YES];
…
}
-(void) viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
// Let hide the navbar when we show the home view
[self.navigationController setNavigationBarHidden:NO];
}
Когда пользователь нажимает значок активности на домашней странице, контроллер представления для активности помещается в стек.
Если пользователь начинает использовать новый жест жесткого диска в iOS, но затем останавливает жест (т.е. решает не возвращаться), все выглядит нормально. Тем не менее, если пользователь заставляет другой контроллер представления быть нажатым в стек навигатора, то nag bar становится непригодным и пользователь не может перейти обратно с текущего контроллера представления.
Примечания
- Это происходит, когда я показываю/скрываю панель навигации
- Я все еще могу выполнить жест назад, и все будет работать нормально, пока я не отменю жест.
- Навигационная панель кажется, что она будет работать, но нажатие на кнопку "Назад" не появляется в контроллере представления.
Ответы
Ответ 1
Не уверен, что вы уже решили это, но я столкнулся с той же проблемой, но с одной разницей. Навигационный стек только запутывается, если я устанавливаю значение "Нет".
Итак, это работает:
[self.navigationController setNavigationBarHidden:YES animated:YES];
...
[self.navigationController setNavigationBarHidden:NO animated:YES];
но это не так:
[self.navigationController setNavigationBarHidden:YES animated:NO];
...
[self.navigationController setNavigationBarHidden:NO animated:NO];
Если вы действительно хотите, чтобы анимированный был NO по какой-либо причине, одна работа заключается в том, чтобы установить альфа-значение 0/1 вместо того, чтобы скрывать/открывать навигационную панель:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.navigationBar.alpha = 0.0f;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[self.navigationController.navigationBar setAlpha:1.0f];
}
Недостатком является то, что нет никакой приятной анимации перехода к слайду. Если вы нашли лучший способ, сообщите нам.
UPDATE. Это уже старый, но я решил свою проблему, не гарантируя, что какое бы то ни было состояние в текущем представлении viewWillDisappear, будет восстановлено в viewWillAppear. Не срывайте вещи в представлении. Посмотрите, что вы не можете настроить снова.
Это то, что происходит, когда вы отменяете поп-анимацию:
- Текущее представлениеWillDisappear
- Новый viewWillAppear
- [отменено... отменяет]
- Новый viewWillDisappear
- Новый viewDidDisappear
- Текущее представлениеWillAppear
- Текущий viewDidAppear
Я думаю, что в этом смелом новом мире viewWillDisappear/viewWillAppear не всегда означает, что "исчезнет/появится":)
Ответ 2
Я думаю, что мое решение может помочь вам.
Предположим, что класс контроллера вашей домашней версии - HomePageViewController (имя класса), а контроллер вида активности называется ActivityViewController (также имя класса)
Во-первых, в представлении HomePageViewControllerWillAppear:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
Во-вторых, в вашем ActivityViewController добавьте следующие коды:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated
{
//trick to fix navigationbar disappear problem that when UIScreenEdgePanGesture is happening.
if ([self.navigationController.topViewController isKindOfClass:[HomePageViewController class]]) {
[self.navigationController setNavigationBarHidden:YES animated:YES];
} else {
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
[super viewWillDisappear:animated];
}
Ответ 3
У меня была такая же проблема, и после поиска, похоже, вы не можете получить уведомление, если жест отменен. В делегате распознавателя жестов нет -shouldCancel
, и на навигационном контроллере нет -willReshowViewController
. Поэтому у меня есть контроллер вида, которому требуется отображаемая панель навигации (т.е. Контроллер, который отменяется) устанавливает self.navigationController.navigationBarHidden = NO
в -viewWillAppear
. Таким образом, когда жест отменяется и вызывается -viewWillAppear
, панель навигации снова будет скрыта. Насколько я могу судить, это единственный способ, чтобы при удалении жестов не было ни жестов салфетки, ни показанных/скрытых навигационных панелей.
Ответ 4
Мне удалось решить эту проблему, используя animated: true
в viewWillAppear
и animated: false
в viewWillDisappear
второго контроллера представления