可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am getting this error when I call my method dismissView. Here is the method stub:
-(IBAction)dismissView
{
RootViewController *rootController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
[self.navigationController popToViewController:rootController animated:YES];
}
That should work, and I've checked, rootController is initialized and allocated. Any ideas?
回答1:
I had this problem recently and solved with something like this...
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
回答2:
I resolved this by using pushViewController
rather than popToViewController
回答3:
The -popToViewController
is used to pop view controllers OFF the stack, down to one that already exists. Your UINavigationController
has a stack of ViewControllers (stored in the viewControllers
property), when you popToViewController
, you're going to want to pass one of the elements in that array as the first argument.
What you most likely want to do in this case is use -popViewControllerAnimated:
, which will remove the top ViewController
from the stack
回答4:
You're allocating the RootViewController right there. It does not exist in the navigation controller's stack, so no matter how far you pop, you won't reach it.
回答5:
If you are using Storyboads, use this segue:
#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
回答6:
The UINavigationController
has a stack of ViewControllers
which is stored in the viewControllers(NSArray) property. Enumerate to the required ViewController
and pop to that ViewController
.
Following code should solve the problem.
-(IBAction)dismissView
{
NSArray *array = self.navigationController.viewControllers;
for (id controller in array) {
if ([controller isKindOfClass:[RootViewController class]]) {
[self.navigationController popToViewController:controller animated:YES];
}
}
}
回答7:
When using Push Segues you can easily go back to the root using this method:
[self.navigationController popToRootViewControllerAnimated:YES];
When using Modal Segues (because of the word dismiss in the question and as a general reference) you can dismiss
the view controller using this method:
[self dismissViewControllerAnimated:YES completion:nil];
回答8:
Swift:
self.navigationController?.popToViewController ((self.navigationController?.viewControllers[1]) as! Your_ViewController, animated: true)
Objective-C:
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];