Ответ 1
У меня была эта проблема в последнее время и решалась с чем-то вроде этого...
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
Я получаю эту ошибку, когда вызываю свой метод rejectView. Ниже приведен метод заглушки:
-(IBAction)dismissView
{
RootViewController *rootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
[self.navigationController popToViewController:rootController animated:YES];
}
Это должно работать, и я проверил, rootController инициализируется и распределяется. Любые идеи?
У меня была эта проблема в последнее время и решалась с чем-то вроде этого...
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
Я решил это, используя pushViewController
, а не popToViewController
-popToViewController
используется для того, чтобы контроллеры pop view отключили стек, вплоть до уже существующего. Ваш UINavigationController
имеет стек ViewControllers (хранится в свойстве viewControllers
), когда вы popToViewController
, вам нужно передать один из элементов в этом массиве в качестве первого аргумента.
В этом случае вы, скорее всего, захотите использовать -popViewControllerAnimated:
, который удалит верхний ViewController
из стека
Вы размещаете RootViewController прямо там. Он не существует в стеке контроллера навигации, поэтому, независимо от того, насколько далеко вы поп, вы не достигнете его.
Если вы используете Storyboads, используйте этот сеанс:
#import "PopToControllerSegue.h"
@implementation PopToControllerSegue
- (void) perform
{
UIViewController *sourceViewController = (UIViewController *)self.sourceViewController;
UIViewController *destinationViewController = (UIViewController *)self.destinationViewController;
for (UIViewController* controller in sourceViewController.navigationController.viewControllers) {
if ([controller isKindOfClass:destinationViewController.class]) {
[sourceViewController.navigationController popToViewController:controller animated:YES];
return;
}
}
NSLog(@"PopToControllerSegue has failed!");
}
@end
Swift 4
Для тех, кто все еще ищет лучшее решение, не включающее индексы стека UINavigationController, которое становится все более проблематичным с большим стеком навигации - вот самый простой способ решить это:
if let destinationViewController = navigationController?.viewControllers
.filter(
{$0.classForCoder == DestinationViewController.self})
.first {
navigationController?.popToViewController(destinationViewController, animated: true)
}
UINavigationController
имеет стек ViewControllers
, который хранится в свойстве viewControllers (NSArray). Перечислите требуемый ViewController
и нажмите на ViewController
.
Следующий код должен решить проблему.
-(IBAction)dismissView
{
NSArray *array = self.navigationController.viewControllers;
for (id controller in array) {
if ([controller isKindOfClass:[RootViewController class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}
}
При использовании Push Segues вы можете легко вернуться к корню, используя этот метод:
[self.navigationController popToRootViewControllerAnimated:YES];
При использовании Modal Segues (из-за слова отклонить в вопросе и в качестве общей ссылки) вы можете dismiss
использовать контроллер вида с помощью этого метода:
[self dismissViewControllerAnimated:YES completion:nil];
Попробуйте это однострочное решение.
Свифт 4+:
self.navigationController?.popToViewController ((self.navigationController?.viewControllers[1]) as! Your_ViewController, animated: true)
Objective-C:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
В моем случае проблема заключалась в том, что я был в корневом ViewController, и это работает только для VC, которые расположены поверх него. Чтобы открыть RootViewController, используйте
navigationController?.popToRootViewController(animated: true)
self.navigationController?.present(viewControllers, animated: true, completion: nil)