在android中,在活动之间切换是相当简单的
你打电话Intent intent = new Intent(this,NextActivity.class); <- define the next activity
startActivity(intent); <- start the next activity
finish(); < -get rid of the current activity
现在在iOS中我知道如何做到这一点:
UIViewController *nextviewcontroller = [[UIViewController alloc]initWithNibName:@"nextvc" bundle:nil];
[self presentViewcontroller:nextviewcontroller animated:YES completion:nil];
如何摆脱当前的视图控制器?以便currentviewcontroller在呈现nextviewcontroller后死掉?
[self dismissViewController:YES];似乎没有做到这一点
即使我不调用[self dismissViewController:YES];
我希望从currentviewcontroller
和viewcontroller堆栈中删除“memory
”,以便点击“nextviewcontroller”中的“back”将转到currentviewcontroller之前的某个第三视图控制器
答案 0 :(得分:1)
在iOS中是不同的,因为没有Activity的概念,一切都更专注于应用程序本身(在Android中,您可以混合来自不同应用程序的活动)。因此,没有&#34;查看控制器堆栈&#34;的概念。 最相似的概念是&#34;导航堆栈&#34;导航控制器,您实际上将新视图控制器推入并弹出某种线性导航。将自动创建导航栏并使用后退按钮填充。
presentViewController将在当前视图控制器上以模态方式显示您的视图控制器,但是您不能将其显示为提升视图控制器,因为它控制并包含(&#34;定义上下文&#34;)新视图控制器。
如果您使用导航控制器作为导航层次结构(我不知道您是否可以),您可以覆盖后退按钮并使用类似
的内容UIViewController * prev = self.navigationController.viewControllers[self.navigationController.viewControllers.count -2 ]
[self.navigationController popToViewController:prev animated:YES]
使用模态视图控制器,您可以尝试类似的东西(我还没有尝试,但它可能有效)
[self.presentingViewController.navigationController popViewControllerAnimated:YES]
您应该将其中一个代码写入关闭按钮的目标操作中。
答案 1 :(得分:1)
iOS并不像Android那样维护全局控制器堆栈。每个应用程序在其根目录中显示一个控制器,并且该应用程序负责显示应用程序中的其他控制器。控制器可以使用presentViewcontroller:animated:completion:
以模态方式显示其他控制器,但呈现控制器仍保留在显示控制器下方。
如果您当前的控制器是根控制器,那么您只需执行此操作,而不是使用presentViewcontroller:animated:completion:
:
self.view.window.rootViewController = nextViewController;
根控制器很常见的是UINavigationController
,它管理着一堆控制器。如果是这种情况,并且如果您当前的控制器位于堆栈的顶部,那么您可以这样做:
[self.navigationController popViewControllerAnimated:NO];
[self.navigationController pushViewController:nextViewController animated:YES];
如果您的设置不同,您可以做一些不同的事情;如果不了解更多,很难说出什么。但最有可能的是你处于UINavigationController
案件中。
答案 2 :(得分:0)
在nextviewcontroller的viewDidAppear中,您可以添加:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSArray *controllers = self.navigationController.viewControllers;
NSMutableArray *newViewControllers = [NSMutableArray arrayWithArray:controllers];
[newViewControllers removeObjectAtIndex:[controllers count]-2];
self.navigationController.viewControllers = newViewControllers;
}
答案 3 :(得分:0)
iOS中没有这样的功能,但您可以通过以下方式实现这一目标
NSArray *viewControllers=[self.navigationController viewControllers];
NSMutableArray *newControllers=[[NSMutableArray alloc] init];
for(int i=[viewControllers indexOfObject:self];i<viewControllers.count;i++){
[newControllers addObject:[viewControllers objectAtIndex:i]];
}
[self.navigationController setViewControllers:[[NSArray alloc] initWithArray:newControllers]];
答案 4 :(得分:0)
我尝试过将所有视图控制器存储在一个数组中的方法,但它并不适用于我。当您尝试popViewController
时,它将移动到堆栈中最后一个的视图控制器。
您可以制作2个导航控制器并在它们之间切换,也可以在特定导航控制器的视图控制器之间切换。
例如。
您可以使用以下代码在2导航控制器之间切换:
FirstNavController *fisrtView=[storyboard instantiateViewControllerWithIdentifier:@"firstnavcontroller"];
self.window.rootViewController = firstView;
}else{
SecondNavController *secondView=[storyboard instantiateViewControllerWithIdentifier:@"loginnavcontroller"];
self.window.rootViewController = secondView;
}
如果您的FirstNavController有2个ViewControllers,那么您可以使用pushViewController在它们之间切换
SecondViewController *sc = [self.storyboard instantiateViewControllerWithIdentifier:@"secondviewcontroller"];
[[self navigationController] pushViewController:sc animated:YES];
和popViewController
[self.navigationController popViewControllerAnimated:YES];