Нажатие и удалениеFromParentControllers, повлияло на структуру навигационного контроллера.

введите здесь описание изображения

Изображение по ссылке выше, не могу включить его в сообщение. Когда я нажимаю от viewControllerA к B, затем я нажимаю от B к C, затем я использую следующий код, чтобы удалить viewControllerB и нажать C на B и удалить viewControllerC:

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

    for(UIViewController *tempVC in navigationArray)
{
    if([tempVC isKindOfClass:[viewControllerB class]])
    {
        [tempVC removeFromParentViewController];
    }
}

    [self performSegueWithIdentifier:@"toViewControllerB" sender:self];

    for(UIViewController *tempVC in navigationArray)
    {
        if([tempVC isKindOfClass:[viewControllerC class]])
        {
            [tempVC removeFromParentViewController];
        }
    }

Итак, теперь ViewControllerA подключен к последнему ViewControllerB. После этого я все еще получаю кнопку «Назад» на панели навигации, но после того, как я нажал кнопку «Назад», ViewControllerB вернулся к ViewControllerA, но в ViewControllerA элементы и заголовок панели навигации ушли, я намеренно снова нажимаю от C до B, чтобы исправить некоторые проблемы с памятью, как я могу заставить это работать, вынув два контроллера представления в середине, но не испортив контроллер навигации? Есть ли другие альтернативы, чтобы сделать это? Спасибо, у меня есть еще один странный подход - программно создать панель навигации с теми же элементами и заголовком, чтобы скрыть ее, но это кажется таким неправильным...


person chan sam    schedule 27.07.2017    source источник


Ответы (2)


Сначала, когда вы хотите нажать от B до C, а затем удалить B, вы можете попробовать это

for(UIViewController *tempVC in navigationArray)
{
    if([tempVC isKindOfClass:[viewControllerB class]])
    {
        [navigationArray removeObject:tempVC];
        break;
    }
}
[self.navigationController setViewControllers:navigationArray];
[self performSegueWithIdentifier:@"toViewControllerB" sender:self];

Но вы должны убедиться, что segue находится от C до B. Тогда вы получите контроллеры A-> C-> B. Если вы хотите нажать на ControllerC и удалить Last C. Попробуйте использовать ту же функцию.

person Anonymous    schedule 27.07.2017

1) Когда вы сначала нажимаете на контроллер C с контроллера B, затем сначала удаляете контроллер B 2) Когда вы нажимаете на контроллер B с контроллера C, затем удаляете контроллер C.

// Код для удаления контроллера C из стека

NSArray *viewControllers = self.navigationController.viewControllers;

NSMutableArray *viewControllersMutable = [NSMutableArray arrayWithArray:viewControllers];
for (UIViewController *vc in viewControllers) {
    if (([viewControllers indexOfObject:vc] != viewControllers.count - 1 ) && [vc isKindOfClass: C.class] ){
        NSLog(@"removing contoller of kind C");
        [viewControllersMutable removeObject:vc];
    }
}

self.navigationController.viewControllers = viewControllersMutable.copy;

// Код для удаления контроллера B

NSArray *viewControllers = self.navigationController.viewControllers;

NSMutableArray *viewControllersMutable = [NSMutableArray arrayWithArray:viewControllers];
for (UIViewController *vc in viewControllers) {
    if (([viewControllers indexOfObject:vc] != viewControllers.count - 1 ) && [vc isKindOfClass: B.class] ){
        NSLog(@"removing contoller of kind B");
        [viewControllersMutable removeObject:vc];
    }
}

self.navigationController.viewControllers = viewControllersMutable.copy;

Примечание -> Вы можете сделать это в том же коде. Проверяется только условие «ИЛИ», что означает, что контроллер B или C.

person Megha_Singh    schedule 28.07.2017