Как я могу поместить контроллер представления под толкаемый контроллер вида?

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

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

    // pop this VC, how?
}

EDIT: получается, что я могу возвращать 2 диспетчера представлений вместо того, чтобы закончить новый VC. Все еще не то, что я хотел точно, но он работает. Недостатком является то, что мне нужно установить флаг, чтобы указать, что закрытое представление завершено.

Ответ 1

Здесь вы найдете способ возврата двух контроллеров представлений, которые имеют аналогичную проблему с вашим текущим контроллером представления и его свойство 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 popped off
//
[[self retain] autorelease];

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

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

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

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

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

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

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

NSMutableArray *VCs = [self.navigationController.viewControllers mutableCopy];
[VCs removeObjectAtIndex:[VCs count] - 2];
self.navigationController.viewControllers = VCs;

Ответ 2

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

Скажем, у вас есть стек VCs 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;

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

Ответ 3

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

    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];

Ответ 4

-(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];
        }
    }
}