【问题标题】:How to dismiss a whole stack of view controllers in navigation view controller?如何在导航视图控制器中关闭整个视图控制器堆栈?
【发布时间】:2017-08-04 06:29:54
【问题描述】:

我有两个导航视图控制器。当我单击属于第二个导航控制器的 ViewController 中的按钮时,我想关闭该导航控制器的完整视图控制器堆栈并希望转到第一个视图控制器导航控制器。我该怎么做?我试过[self.navigationController dismissViewControllerAnimated:YES completion:nil];,但似乎什么也没发生。怎么做?

【问题讨论】:

  • 为什么有两个导航控制器?它们之间有什么关系?
  • 我认为你可以设置 self.navigationController.viewControllers = @[] 然后推送需要的东西。我不知道你是否想要动画。
  • @AndréSlotta 他们彼此没有关系
  • @TomCobo 不,我不想再推,我想关闭整个视图控制器
  • 您可以使用 popToRootViewController 访问根视图控制器,但无法关闭导航

标签: ios objective-c uiviewcontroller uinavigationcontroller


【解决方案1】:

错误必须在其他地方。您描述的您正在使用的代码确实有效。我新建了一个项目,做了一个极其简单的例子:

#import "ViewController.h"

@interface MyViewController : UIViewController
- (instancetype)initWithColor:(UIColor *)color;
@end


@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    [self presentViewController:[[UINavigationController alloc] initWithRootViewController:[[MyViewController alloc] initWithColor:[UIColor redColor]]] animated:YES completion:nil];
}

@end



@implementation MyViewController

- (instancetype)initWithColor:(UIColor *)color {
    if((self = [super init])) {
        self.view.backgroundColor = color;
    }
    return self;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    CGPoint point = [touches.anyObject locationInView:nil];
    if(point.x < self.view.frame.size.width*0.5 && point.y < self.view.frame.size.width*0.5) {
        [self.navigationController pushViewController:[[MyViewController alloc] initWithColor:self.view.backgroundColor] animated:YES];
    } else if(point.x > self.view.frame.size.width*0.5 && point.y < self.view.frame.size.width*0.5) {
        [self.navigationController presentViewController:[[UINavigationController alloc] initWithRootViewController:[[MyViewController alloc] initWithColor:[UIColor greenColor]]] animated:YES completion:nil];
    } else if(point.x < self.view.frame.size.width*0.5 && point.y > self.view.frame.size.width*0.5) {
        [self.navigationController popViewControllerAnimated:true];
    } else if(point.x > self.view.frame.size.width*0.5 && point.y > self.view.frame.size.width*0.5) {
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    }
}

@end

如果你将它复制到一个新项目中,ViewController 是你的主视图控制器,一个导航控制器将被创建并呈现在视图上。背景将是红色的。

通过按下屏幕的左上角,一个相同颜色的新控制器将被推送到当前顶部导航控制器。

按下右上角的新导航控制器将显示一个绿色视图控制器。

按下左下角可以弹出当前视图控制器(如果有的话)。

按下右下角,您将关闭顶部导航控制器。

因此,您的情况是按几次左上角以在单个导航控制器上生成一堆视图控制器。然后按右上角以显示另一个导航控制器(绿色)。在左上角按几次以在绿色导航控制器上创建一堆视图控制器。现在按右下角关闭整个绿色堆栈并返回红色导航控制器堆栈。

进一步检查您的代码以了解您的案例发生了什么,以及您遇到问题的原因。首先检查self.navigationController是否为nil。

【讨论】:

    【解决方案2】:

    试试这个,我认为它适合你

    self.navigationController?.popToRootViewController(animated: true)
    

    【讨论】:

    • 你看到这个问题了吗I have two navigation view controllers
    • Mitul ,不,这不起作用,因为我要显示的视图控制器在另一个导航视图控制器中。
    • 让 storyboard = UIStoryboard.init(name: "storyboardname", bundle: nil) mainNavVC = storyboard.instantiateViewController(withIdentifier: "navigationcontrollername") as! UINavigationController mainNavVC.setNavigationBarHidden(true, animated: false) mainNavVC.setViewControllers([viewcontrollername], animated: true) self.window?.rootViewController = mainNavVC
    猜你喜欢
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2012-08-11
    • 2013-12-26
    • 1970-01-01
    • 2016-12-11
    • 2012-05-04
    • 2023-03-08
    相关资源
    最近更新 更多