iOS 简单视图从导航堆栈错误弹出

Posted

技术标签:

【中文标题】iOS 简单视图从导航堆栈错误弹出【英文标题】:iOS Simple View Pop from Navigation Stack Error 【发布时间】:2014-09-01 23:22:26 【问题描述】:

我的故事板如下所示:

我想要实现的是,当在主页上按下“点击我”时,转到“一”,检查这个控制器上的一些逻辑,如果成功,自动转到“二”。

然后,当在“Two”上按下“Back”按钮时,它会将用户带回家,实质上是从堆栈中弹出“One”。

下面是我的“One”控制器的样子:

@implementation OneViewController

- (void)viewDidLoad

    [super viewDidLoad];

    // example logic, in this case just force them to view two
    if(1 == 1)
    
        [self.navigationController popViewControllerAnimated:NO];

        TwoViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
        [self.navigationController pushViewController:vc animated:YES];
    


@end

我遇到了奇怪的行为并收到以下错误:

在意外状态下完成导航转换。 导航栏子视图树可能已损坏。

我似乎无法弄清楚我做错了什么。我已经包含了完整的死简单来源:http://andrewherrick.com/spike/pushpop.zip

编辑:

我尝试将逻辑移至 ViewDidAppear,它只是自动将我踢回“主页”视图,这不是我想要的。

- (void)viewDidLoad

    [super viewDidLoad];


-(void)viewDidAppear:(BOOL)animated 

    // example logic, in this case just force them to view two
    if(1 == 1)
    
        [self.navigationController popViewControllerAnimated:NO];

        TwoViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
        [self.navigationController pushViewController:vc animated:NO];
    

【问题讨论】:

嘿,我对 Stroyboard 没有完整的了解,但我确实在基于视图的 UINavigaitonController 中实现了这一点。如果你想知道我可以提供帮助 【参考方案1】:

将您的第二个推送逻辑放入 viewDidAppear: 而不是 viewDidLoad 为我解决了这个问题。

您还应该考虑应用的用户体验。如果一个 viewController 只被使用几秒钟来处理一些数据并自动进入另一个 viewController,最好显示一个 UIActivityIndicator 或一个小的视觉指示器。

编辑: 您的自动推送不应在推送另一个推送之前自行弹出。

- (void)viewDidAppear:(BOOL)animated

    if(1 == 1)
    
        TwoViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"two"];
        [self.navigationController pushViewController:vc animated:YES];
    

然后在您的TwoViewController 中您需要以编程方式调用

[self.navigationController popToRootViewControllerAnimated:YES];

为了弹回你的主视图控制器。

【讨论】:

感谢您的帮助。我已经更新了上面的答案,但它不起作用。那是你的意思吗?谢谢! 对不起,我忘了提到我还删除了[self.navigationController popViewControllerAnimated:NO];这一行当你在SecondViewController上时,你需要为'返回'按钮创建一个IBOutlet并让它执行这个[self.navigationController popToRootViewControllerAnimated:YES]; Hmmm.. 好的整洁.. 所以没有办法做到这一点,必须覆盖视图二上的后退按钮的默认行为?我并不打算一定要调用 popToRootViewController 方法

以上是关于iOS 简单视图从导航堆栈错误弹出的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中的任何位置弹出到任意视图控制器

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

导航栏在iOS 9.2中显示错误的导航项

从导航堆栈推送/弹出uiviewcontroller时如何收到警报

自动弹出导航链接问题

iOS如何在弹出顶视图控制器时以编程方式检测?