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

时间:2014-04-10 09:00:09

标签: ios uiviewcontroller

在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];

,也会调用生命周期方法viewWillDisappear和viewDidDisappear

我希望从currentviewcontroller和viewcontroller堆栈中删除“memory”,以便点击“nextviewcontroller”中的“back”将转到currentviewcontroller之前的某个第三视图控制器

5 个答案:

答案 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];