UINavigationController setViewController: анимированный: трудности с панелью навигации - PullRequest
6 голосов
/ 06 января 2010

У меня невероятно неприятная проблема, которая кажется ошибкой, но мне очень трудно поверить, что больше никто не сталкивался с этим. Контроллер корневого представления моего приложения представляет собой UITabBarController, где каждая вкладка представляет собой UINavigationController. Все отлично работает.

Теперь я пришел к месту, где я хочу отредактировать стек, поэтому я переставил viewControllers текущего контроллера навигации и затем сделал:

[self.navigationController setViewControllers:newViewControllers animated:YES];

Стек правильно извлечен / передан в контроллер верхнего вида, но панель навигации не обновляется до текущего контроллера представления и, кажется, остается точно такой же, как это было с viewController до появления. Если я сделаю:

[self.navigationController popToViewController:someViewController animated:YES];

Все отлично работает. Кто-нибудь когда-нибудь сталкивался с этим раньше? Есть ли обходной путь? Что-то я делаю не так?

Ответы [ 6 ]

6 голосов
/ 28 мая 2014

Я столкнулся с той же проблемой, похоже, что Apple не исправила эту ошибку, и в результате выбранный ответ в этой теме кажется неправильным. Мне удалось исправить эту проблему, используя этот отчет об ошибке , как в комментарии Anurag в сочетании с комментарием Скотта Пфейля.

Вот код:

navController.navigationBarHidden = YES;

NSArray* viewControllers =  navController.viewControllers;
UIViewController* currentController = [viewControllers objectAtIndex:viewControllers.count-1];

NSArray *controllers = [NSArray arrayWithObjects: viewController , currentController , nil];

[navController setViewControllers:controllers animated:NO];

navController.navigationBarHidden = NO;

Я называю этот код в viewDidLoad currentController, и я заменил предыдущие контроллеры только на viewController.

Надеюсь, это поможет.

2 голосов
/ 29 апреля 2010

Apple, похоже, исправила это в новейшем SDK

1 голос
/ 06 января 2010

Два одинаково безобразных обходных пути.

Во-первых, Если:

[self.navigationController popToViewController:someViewController animated:YES];

Работает хорошо, попробуйте поместить дополнительный стек viewcontroller в стек и затем вызовите:

[self.navigationController popToViewController:someViewController animated:NO];

Это означает, что вы должны добраться до нужного вам виртуального канала без какой-либо анимации.

Во-вторых,

Перед установкой стека установите leftButtonBarItem = nil; Эффективно удаляя кнопку контроллера старого представления. На самом деле, если название неверно, измените это тоже.

Ни один не совсем чистый, но может дать вам желаемые результаты.

0 голосов
/ 10 июля 2018

Я все еще сталкиваюсь с этой проблемой в Xcode 9.4.1 & iOS 11.4 .

Самый простой способ - вызвать loadViewIfNeeded() для всех предыдущих контроллеров представления в стеке навигации:

let menuViewController = ...
menuViewController.loadViewIfNeeded()

let submenuViewController = ...

navigationController.setViewControllers([menuViewController, submenuViewController], animated: true)
0 голосов
/ 18 августа 2010
[self.navigationController setViewControllers:newViewControllers animated:NO];

это может вам помочь.

0 голосов
/ 11 февраля 2010

Вы также можете установить свой корневой контроллер вида в качестве делегата UINavigationController, например:

@interface YourViewController : UIViewController <UINavigationControllerDelegate> {

и затем в методе делегата didShowViewController вы вручную устанавливаете доступные контроллеры представления:

-(void)navigationController:(UINavigationController*)navigationController didShowViewController:(UIViewController*)viewController animated:(BOOL)animated {
    [[viewController navigationController] setViewControllers:[[viewController navigationController] viewControllers]];
}

Дайте мне знать, если это работает в вашей среде!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...