我的故事板如下所示:
我想要实现的是当在主页上按下“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];
}
}
答案 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。