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

时间:2014-09-01 23:22:26

标签: ios objective-c iphone uinavigationcontroller uistoryboardsegue

我的故事板如下所示:

enter image description here

我想要实现的是当在主页上按下“Click Me”时,要切换到“One”,检查该控制器上的某些逻辑,如果成功,则自动转到“Two”。

然后当在“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,它只是让我自动回到“Home”视图,这不是我想要的。

- (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];
    }
}

1 个答案:

答案 0 :(得分:0)

将第二个推送逻辑放在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];

以便弹回您的主viewController。