嵌套推送动画可能导致导航栏损坏PUSH POP PUSH

时间:2013-11-10 05:42:12

标签: ios iphone

我有三个控制器第一,第二,第三。首先是navigationController的rootViewController。

SecondViewController 中的

,我有一个名为 SecondViewControllerDelegate 的协议,它有一个委托方法

@protocol SecondViewControllerDelegate <NSObject>

- (void)doneSucceed:(NSString *)msg;

@end

在FirstViewController中,我有一个按钮,点击它时,执行以下操作

[self.navigationController pushViewController:_s animated:YES];

_s表示其委托是FirstViewController

的SecondViewController 在doneSucceed方法中执行以下操作

- (void)doneSucceed:(NSString *)msg
{
    NSLog(@"%@", msg);
    [self.navigationController popViewControllerAnimated:YES];
    [self.navigationController pushViewController:_t animated:YES];
}

然后是错误

  

嵌套推送动画可能导致导航栏损坏   显示,有人告诉我为什么? THX

3 个答案:

答案 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]