我有三个控制器第一,第二,第三。首先是navigationController的rootViewController。
在 SecondViewController 中的,我有一个名为 SecondViewControllerDelegate 的协议,它有一个委托方法
@protocol SecondViewControllerDelegate <NSObject>
- (void)doneSucceed:(NSString *)msg;
@end
在FirstViewController中,我有一个按钮,点击它时,执行以下操作
[self.navigationController pushViewController:_s animated:YES];
_s表示其委托是FirstViewController
的SecondViewController- (void)doneSucceed:(NSString *)msg
{
NSLog(@"%@", msg);
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController pushViewController:_t animated:YES];
}
然后是错误
嵌套推送动画可能导致导航栏损坏 显示,有人告诉我为什么? THX
答案 0 :(得分:5)
问题是你正在调用pop和推送动画背靠背。在iOS6中,推送调用基本上被忽略,但在iOS7中,在弹出动画时调用推送,因此它们是“嵌套”的,您将得到以下内容:
nested push animation can result in corrupted navigation bar show
您可以从SecondViewController进行pop调用,而不是在doneSucceed中弹出。然后等待FirstViewController的viewDidAppear推送ThirdViewController。你可以使用doneSucceed方法来切换你是否应该转换到viewDidAppear上的ThirdViewController
答案 1 :(得分:1)
将导航控制器假设为一组viewcontrollers。
[self.navigationController popViewControllerAnimated:YES];
会从堆栈中弹出viewcontroller。现在viewcontroller无效。从那个无效的viewcontroller你正在调用
[self.navigationController pushViewController:_t animated:YES];
因此它是一个堆栈,该值是中间无效并试图从无效的中间值推送一个值
如果1,2,3是堆栈的成员,可以删除2但是删除的2正在尝试添加3以上2并且因为2已经不在堆栈3中无法正确添加
答案 2 :(得分:0)
通过设置navigationController的viewControllers属性,还可以做你想要的事情
NSMutableArray* controllers = [[self.navigationController viewController] mutableCopy];
[controllers removeLastObject];
[controllers addObject:_t];
[self.navigationController setViewControllers:controllers animated:YES]