iOS7 UINavigationController pushViewController:动画背靠背动画锁定主线程

时间:2013-10-31 18:43:19

标签: ios objective-c animation uinavigationcontroller ios7

据我所知,似乎用动画背靠背推进UINavigationController会在iOS7上造成死锁。

我最初在iOS6上遇到了崩溃,并提出了以下解决方案:

  1. 创建一个视图控制器数组,以便在初始推送后推送到导航控制器。因此,如果要推送三个视图控制器(A,B和C),那么此数组将具有B和C.

  2. 实施UINavigationControllerDelegate' navigationController:didShowViewController:animated:

  3. 在委托方法中,只需检查视图控制器数组中是否有更多元素。如果是这样,请从中取出第一个元素并将其推入导航控制器。 所以基本上如果要推送B和C视图控制器,navigationController:didShowViewController:animated:将被调用三次;每次视图控制器从A开始被推动后。显然,最后一次调用不会做任何事情,因为此时数组应为空。

  4. 请注意,这种方法在iOS6上运行良好。但是,这在iOS7中打破了。似乎当它试图在第二次推送中制作动画时,应用程序会冻结。在进一步挖掘之后,我想出了在委托实现中以下列方式推送第二个视图控制器的解决方案。

    dispatch_async(dispatch_get_main_queue(), ^{
        [navigationController pushViewController:viewController 
                                        animated:YES];
    });
    

    这似乎解决了这个问题,但我想知道是否有人经历过类似的事情,并且对于究竟发生了什么有更好的解释。

1 个答案:

答案 0 :(得分:0)

我不确定你遇到了什么问题。我创建了一个测试应用程序,它有一个导航控制器和四个其他控制器第一个控制器有一个按钮,可以推送到第二个控制器,即FirstPushedViewController。在那个控制器中,我有这个代码来推送下两个控制器,它在iOS 7中运行良好:

@interface FirstPushedViewController ()
@property (strong,nonatomic) NSMutableArray *vcs;
@end

@implementation FirstPushedViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.delegate = self;
    UIViewController *orange = [self.storyboard instantiateViewControllerWithIdentifier:@"Orange"];
    UIViewController *red = [self.storyboard instantiateViewControllerWithIdentifier:@"Red"];
    self.vcs = [@[red,orange] mutableCopy];
}

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (self.vcs.count > 0) {
        [self.navigationController pushViewController:self.vcs.lastObject animated:YES];
        [self.vcs removeLastObject];
    }
}