Как я могу извлечь представление из UINavigationController и заменить его другим в одной операции? - PullRequest
83 голосов
/ 04 января 2009

У меня есть приложение, в котором мне нужно удалить одно представление из стека UINavigationController и заменить его другим. Ситуация такова, что первое представление создает редактируемый элемент, а затем заменяет себя редактором для элемента. Когда я делаю очевидное решение в первом представлении:

MyEditViewController *mevc = [[MYEditViewController alloc] initWithGizmo: gizmo];

[self retain];
[self.navigationController popViewControllerAnimated: NO];
[self.navigationController pushViewController: mevc animated: YES];
[self release];

У меня очень странное поведение. Обычно отображается окно редактора, но если я пытаюсь использовать кнопку «Назад» на навигационной панели, я получаю дополнительные экраны, некоторые пустые, а некоторые просто облажались. Название тоже становится случайным. Это похоже на то, что стек навигации полностью закрыт.

Как лучше подходить к этой проблеме?

Спасибо, Matt

Ответы [ 16 ]

1 голос
/ 04 января 2009

Этот UINavigationController метод экземпляра может работать ...

Выводит контроллеры вида, пока указанный контроллер вида не является контроллером вида сверху, а затем обновляет дисплей.

- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated
0 голосов
/ 27 февраля 2018

Я использую это решение, чтобы сохранить анимацию.

[self.navigationController pushViewController:controller animated:YES];
NSMutableArray *newControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[newControllers removeObject:newControllers[newControllers.count - 2]];
[self.navigationController setViewControllers:newControllers];
0 голосов
/ 24 июня 2015

Не совсем ответ, но может помочь в некоторых сценариях (например, у меня):

Если вам нужно выдвинуть viewcontroller C и перейти к B (вне стека) вместо A (тот, что ниже C), можно нажать B перед C и иметь все 3 в стеке. Удерживая нажатие клавиши B невидимым и выбирая, следует ли использовать только C или C и B, вы можете добиться того же эффекта.

начальная проблема A -> C (я хочу открыть C и показать B вне стека)

возможное решение A -> B (толкнул невидимый) -> C (когда я нажимаю C, я выбираю, чтобы показать B или также вывести его)

0 голосов
/ 20 августа 2013

С другой стороны,

Вы можете использовать category, чтобы self.navigationController не было nil после popViewControllerAnimated

просто нажмите и нажмите, это легко понять, не требуется доступ viewControllers ....

// UINavigationController+Helper.h
@interface UINavigationController (Helper)

- (UIViewController*) popThenPushViewController:(UIViewController *)viewController animated:(BOOL)animated;

@end


// UINavigationController+Helper.m
@implementation UINavigationController (Helper)

- (UIViewController*) popThenPushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    UIViewController *v =[self popViewControllerAnimated:NO];

    [self pushViewController:viewController animated:animated];

    return v;
}
@end

В вашем ViewController

// #import "UINavigationController+Helper.h"
// invoke in your code
UIViewController *v= [[MyNewViewController alloc] init];

[self.navigationController popThenPushViewController:v animated:YES];

RELEASE_SAFELY(v);
0 голосов
/ 26 июня 2013

Для однотонного / ксамаринового IOS:

внутри класса UISplitViewController;

UINavigationController mainNav = this._navController; 
//List<UIViewController> controllers = mainNav.ViewControllers.ToList();
mainNav.ViewControllers = new UIViewController[] { }; 
mainNav.PushViewController(detail, true);//to have the animation
0 голосов
/ 25 сентября 2012

С помощью массива контроллеров представления навигации вы можете проверить все контроллеры представления, добавленные в стек навигации. Используя этот массив, вы можете вернуться к определенному контроллеру представления.

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