首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在视图控制器之间切换并摆脱前一个视图控制器

如何在视图控制器之间切换并摆脱前一个视图控制器
EN

Stack Overflow用户
提问于 2014-04-10 17:00:09
回答 5查看 261关注 0票数 1

在android中,在活动之间切换相当简单

你打电话给

代码语言:javascript
运行
复制
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中,我知道如何做到这一点:

代码语言:javascript
运行
复制
UIViewController *nextviewcontroller = [[UIViewController alloc]initWithNibName:@"nextvc" bundle:nil];
[self presentViewcontroller:nextviewcontroller animated:YES completion:nil];

如何摆脱当前的视图控制器?所以currentviewcontroller在呈现nextviewcontroller之后就会死掉?

self dismissViewController:是的;似乎没有起到作用

即使不调用[self dismissViewController:YES];,也会调用生命周期方法viewWillDisappear和viewDidDisappear

我希望从memory和视图控制器堆栈中删除"currentviewcontroller“,这样单击"nextviewcontroller”中的"back“将转到当前视图控制器之前的某个第三个视图控制器。

EN

回答 5

Stack Overflow用户

发布于 2014-04-10 17:10:50

在iOS中则不同,因为没有活动的概念,一切都更专注于应用程序本身(在安卓系统中,你可以混合来自不同应用程序的活动)。因此,没有“视图控制器堆栈”的概念。最相似的概念是导航控制器的“导航堆栈”,您实际上将新的视图控制器推入和弹出到某种线性导航中。系统会自动创建导航栏,并使用后退按钮填充导航栏。

presentViewController将在当前视图控制器的基础上以模态方式显示您的视图控制器,但您不能颠覆呈现的视图控制器,因为它持有并包含(“定义上下文”)新的视图控制器。

如果您为导航层次结构使用导航控制器(我不知道您是否可以),您可以覆盖back按钮,并使用类似于

代码语言:javascript
运行
复制
UIViewController * prev = self.navigationController.viewControllers[self.navigationController.viewControllers.count -2 ]
[self.navigationController popToViewController:prev animated:YES]

使用模式视图控制器,您可以尝试类似(我还没有尝试过,但它可能会起作用)

代码语言:javascript
运行
复制
[self.presentingViewController.navigationController popViewControllerAnimated:YES]

您应该将这些代码之一写入到close按钮的目标操作中。

票数 1
EN

Stack Overflow用户

发布于 2014-04-10 17:13:03

iOS不像安卓那样维护一个全局的控制器堆栈。每个应用程序在其根目录显示一个控制器,该控制器负责显示应用程序中的其他控制器。控制器可以使用presentViewcontroller:animated:completion:以模态方式显示其他控制器,但呈现的控制器仍位于呈现的控制器的下方。

如果您当前的控制器是根控制器,那么您可以这样做,而不是使用presentViewcontroller:animated:completion:

代码语言:javascript
运行
复制
self.view.window.rootViewController = nextViewController;

根控制器通常是一个UINavigationController,它管理一堆控制器。如果是这样的话,如果你的当前控制器在堆栈的顶部,你可以这样做:

代码语言:javascript
运行
复制
[self.navigationController popViewControllerAnimated:NO];
[self.navigationController pushViewController:nextViewController animated:YES];

如果你的设置不同,你就会做一些不同的事情;如果不知道更多,就很难说出是什么。但最有可能的是你在UINavigationController的情况下。

票数 1
EN

Stack Overflow用户

发布于 2014-04-10 17:05:49

在下一个视图控制器的viewDidAppear中,您可以添加:

代码语言:javascript
运行
复制
-(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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22983353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档