Навигационный стек становится непригодным после отмены 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 второго контроллера представления