ios 在同一动作中弹出和推送视图控制器
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6872852/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
popping and pushing view controllers in same action
提问by Josh
is is possible to pop a view off the navigation stack and then push another straight onto it?
是否可以从导航堆栈中弹出一个视图,然后将另一个直接推到它上面?
I'm trying to implement a flat hierarchy for this section and would like to have a segmented controller but I can't make the segmented controller look anything liked I want, hence why I'm trying to use the navigation controller.
我正在尝试为此部分实现平面层次结构,并且想要一个分段控制器,但我无法使分段控制器看起来像我想要的任何东西,因此我尝试使用导航控制器。
When a button is clicked I executed this code:
单击按钮时,我执行了以下代码:
[[self navigationController] popViewControllerAnimated:YES];
MapsViewController *aViewController = [[MapsViewController alloc]
initWithNibName:@"MapsViewController" bundle:nil];
[self.navigationController pushViewController:aViewController animated:NO];
[aViewController release];
It's popping off ok but theres no sign of any pushing! Any help would be appreciated.
它弹出确定,但没有任何推动的迹象!任何帮助,将不胜感激。
采纳答案by Vijay-Apple-Dev.blogspot.com
MapsViewController *aViewController = [[MapsViewController alloc]
initWithNibName:@"MapsViewController" bundle:nil];
// 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 this controller and replace with another
[navController popViewControllerAnimated:NO];//not to see pop
[navController pushViewController:aViewController animated:YES];//to see push or u can change it to not to see.
Or
或者
MapsViewController *aViewController = [[MapsViewController alloc]
initWithNibName:@"MapsViewController" bundle:nil];
UINavigationController *navController = self.navigationController;
//Get all view controllers in navigation controller currently
NSMutableArray *controllers=[[NSMutableArray alloc] initWithArray:navController.viewControllers] ;
//Remove the last view controller
[controllers removeLastObject];
//set the new set of view controllers
[navController setViewControllers:controllers];
//Push a new view controller
[navController pushViewController:aViewController animated:YES];
回答by Peter Johnson
Taken from https://stackoverflow.com/users/1619554/tomer-peled's solution, so others can find it more easily.
取自https://stackoverflow.com/users/1619554/tomer-peled的解决方案,因此其他人可以更轻松地找到它。
This appears to be the best way to do it for iOS8:
对于 iOS8,这似乎是最好的方法:
UIViewController *newVC = [[UIViewController alloc] init]; // Replace the current view controller
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:[[self navigationController] viewControllers]];
[viewControllers removeLastObject];
[viewControllers addObject:newVC];
[[self navigationController] setViewControllers:viewControllers animated:YES];
回答by Rodrigo Pinto
In Swift:
在斯威夫特:
let newVc = UIViewController()
var vcArray = self.navigationController?.viewControllers
vcArray!.removeLast()
vcArray!.append(newVc)
self.navigationController?.setViewControllers(vcArray!, animated: false)
In case newVc exists in a Storyboard:
如果故事板中存在 newVc:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let newVc = storyboard.instantiateViewControllerWithIdentifier("YourViewControllerIdentifier") as! UIViewController
var vcArray = self.navigationController?.viewControllers
vcArray!.removeLast()
vcArray!.append(newVc)
self.navigationController?.setViewControllers(vcArray!, animated: false)
回答by byJeevan
Swift 4 :
斯威夫特 4:
self.navigationController.setViewControllers[]..
doesn't worked out for me. But I am able to solve the issue by holding a navigation controller in an instance variable and do push/pop operation. Thus, silently able to change controller without glitch.
self.navigationController.setViewControllers[]..
不适合我。但是我能够通过在实例变量中保存导航控制器并执行推送/弹出操作来解决该问题。因此,可以无声地更改控制器而不会出现故障。
guard let navigationVC = self.navigationController else { return }
navigationVC.popViewController(animated: false)
navigationVC.pushViewController(myNewVC, animated: false)
回答by Vikram Pote
You can use this code to pop or push your controller.
您可以使用此代码弹出或推送您的控制器。
For objective c
对于目标 c
bool alreadyPushed = false;
//Check if the view was already pushed
NSMutableArray *viewControllers;
if ( (viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers])) {
for (UIViewController *aViewController in viewControllers) {
if ([aViewController isKindOfClass:[YourControllerName class]]) {
NSLog(@"pop your view controller");
[self.navigationController popToViewController:aViewController animated:YES];
alreadyPushed = true;
break;
}
}
}
//Push Fresh View
if( alreadyPushed == false) {
NSLog(@"push your view controller");
YourControllerName *YourControllerObject = [[YourControllerName alloc]initWithNibName:@"YourNibName" bundle:nil];
[self.navigationController pushViewController:YourControllerObject animated:YES];
}
For Swift
对于斯威夫特
var alreadyPushed = false
//Check if the view was already pushed
if let viewControllers = self.navigationController?.viewControllers {
for viewController in viewControllers {
if let viewController = viewController as? YourControllerName {
self.navigationController?.popToViewController(viewController, animated: true);
print(" Push Your Controller")
alreadyPushed = true
break
}
}
}
if alreadyPushed == false {
let YourControllerObject = self.storyboard?.instantiateViewControllerWithIdentifier("YourControllerIdentifire") as! YourControllerName
self.navigationController?.pushViewController(YourControllerObject, animated: true)
}
回答by Vikash Kumar
BOOL Present = NO;
fifthViewController * fifthVC = [self.storyboard instantiateViewControllerWithIdentifier:@"homeController"];
for (UIViewController* viewController in self.navigationController.viewControllers) {
//This if condition checks whether the viewController's class is MyGroupViewController
// if true that means its the MyGroupViewController (which has been pushed at some point)
if ([viewController isKindOfClass:[fifthViewController class]] )
{
// Here viewController is a reference of UIViewController base class of MyGroupViewController
// but viewController holds MyGroupViewController object so we can type cast it here
fifthViewController *groupViewController = (fifthViewController*)viewController;
[self.navigationController popToViewController:groupViewController animated:NO];
Present=YES;
}
}
if(Present==NO)
{
[self PushAnimation];
[self.navigationController pushViewController:fifthVC animated:NO];
Present=YES;
}
回答by Mohit Padalia
Swift 3.0
斯威夫特 3.0
In case someone wants to go deep into the view hierarchy:
如果有人想深入了解视图层次结构:
//Go back to desired viewController and then push another viewController
var viewControllers = self.navigationController!.viewControllers
while !(viewControllers.last is MyViewControllerClass) {
viewControllers.removeLast()
}
// go to new viewController
let anotherViewController = AnotherViewController(nibName: "AnotherViewController", bundle: nil)
viewControllers.append(anotherViewController)
self.navigationController?.setViewControllers(viewControllers, animated: true)