Как я помещаю контроллер представления под выдвинутым контроллером представления? - PullRequest
10 голосов
/ 13 февраля 2011

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

-(void) someMethod {
    MegaSuperAwesomeViewController *tempVC = [[MegaSuperAwesomeViewController alloc] init];
    [self.navigationController pushViewController:tempVC animated:YES];
    [tempVC release];

    // pop this VC, how?
}

РЕДАКТ.новый вк.Все еще не то, что я хотел точно, но это работает.Недостатком является то, что мне нужно установить флаг, чтобы указать, что закрытый вид завершен.

Ответы [ 4 ]

16 голосов
/ 13 февраля 2011

Вот метод возврата двух контроллеров представления, который имеет аналогичную проблему с вашим текущим контроллером представления и его свойством navigationController, исчезающим, как только вы делаете первое всплывающее окно:

// pop back 2 controllers on the stack to the setup screen
//

// locally store the navigation controller since
// self.navigationController will be nil once we are popped
//
UINavigationController *navController = self.navigationController;

// retain ourselves so that the controller will still exist once it's popped off
//
[[self retain] autorelease];

// Pop back 2 controllers to the setup screen
//
[navController popViewControllerAnimated:NO];
[navController popViewControllerAnimated:YES];

в качестве альтернативы, вы можете напрямую "party" на стеке контроллеров навигации контроллеров представления:

setViewControllers: animated: заменяет контроллеры представления в настоящее время управляются навигационным контроллером с указанные предметы.

  • (void) setViewControllers: (NSArray *) viewControllers animated: (BOOL) animated Параметры viewControllers Контроллеры представления поместить в стек. Порядок следования контроллеров в этом массиве представляет новый порядок сверху вниз контроллеров в стеке навигации. Таким образом последний добавленный в массив элемент становится верхний элемент стека навигации. анимированный Если ДА, анимируйте нажатие или выскочить из контроллера вид сверху. Если НЕТ, замените контроллеры вида без каких-либо анимаций. Обсуждение Вас можно использовать этот метод для обновления или заменить текущий контроллер вида стек без толкания или выталкивания каждого Контроллер явно. К тому же, этот метод позволяет обновить набор контроллеры без анимации изменения, которые могут быть уместны в время запуска, когда вы хотите вернуться навигационный контроллер для предыдущее состояние.

Если анимации включены, этот метод решает, какой тип перехода к выполнять в зависимости от того, последний элемент в массиве элементов уже находится в стек навигации. Если вид контроллер в данный момент находится в стеке, но это не самый главный предмет, это метод использует поп-переход; если это самый верхний элемент, без перехода выполнила. Если контроллер представления не в стеке, этот метод использует толчок переход. Только один переход выполняется, но когда этот переход заканчивается, все содержимое стек заменяется новым видом контроллеры. Например, если контроллеры A, B и C находятся на стек и вы устанавливаете контроллеры D, A, и B, этот метод использует поп переход и результирующий стек содержит контроллеры D, A и B.

Доступность Доступно в iOS 3.0 и потом. Объявлен в UINavigationController.h

Итак, чтобы «скрыть» контроллер представления непосредственно под вами в стеке навигации, в viewDidLoad контроллера представления, вы можете сделать это:

NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy];
[VCs removeObjectAtIndex:[VCs count] - 2];
self.navigationController.viewControllers = VCs;
8 голосов
/ 16 декабря 2013

У меня также были проблемы с выяснением этого, поэтому я хотел поделиться с вами тем, как я это получил.

Допустим, у вас есть стек VC VC1 , являющийся корнем, а затем вы нажимаете VC2 и из VC2 вы хотите нажать VC3 , но после нажатия вы не хотите, чтобы пользователь вернулся к VC2 , а скорее к VC1 (корень).Способ сделать это:

//push VC3 from VC2
[[self navigationController] pushViewController:VC3 animated:YES];

// now remove VC2 from the view controllers array so we will jump straight back to VC1
NSMutableArray *viewHeirarchy =[[NSMutableArray alloc] initWithArray:[self.navigationController viewControllers]];
[viewHeirarchy removeObject:self];
self.navigationController.viewControllers = viewHeirarchy;

Надеюсь, это поможет кому-то еще

0 голосов
/ 02 апреля 2017
-(void)popToSelf{

    NSArray *array = [self.navigationController viewControllers];

    for (int i = 0 ; i < array.count ; i++) {
        UIViewController *currentVC = [array objectAtIndex:i];
        if ([currentVC isKindOfClass:[YourViewControllerClass class]]) {
            [self.navigationController popToViewController:[array objectAtIndex:i] animated:YES];
        }
    }
}
0 голосов
/ 17 сентября 2011

Спасибо Богатырь за подсказку о 'party в массиве viewcontroller для navcontroller'. Я просто заменил весь стек одним viewcontroller, на который я хочу изменить, и затем вышел из системы всех контроллеров view в стеке, чтобы убедиться, что он единственный! Работал отлично - спасибо!

    RatingsTableViewController *newViewController = [[RatingsTableViewController alloc] init];
    NSMutableArray * newVCarray = [NSMutableArray arrayWithObjects:newViewController, nil];
    self.navigationController.viewControllers = newVCarray;

    [newViewController release];

     NSMutableArray *allControllers = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers];

    for (id object in allControllers) {

          NSLog(@"name VC: %@", object);
    }
    [allControllers release];
...