【问题标题】:iOS7 UINavigationController pushViewController:animated back to back with animation locks up the main threadiOS7 UINavigationController pushViewController:animated back to back with animation 锁住主线程
【发布时间】:2013-10-31 18:43:19
【问题描述】:

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

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

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

  2. 实现UINavigationControllerDelegatenavigationController:didShowViewController:animated:

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

请注意,这种方法在 iOS6 上运行良好。但是,这在 iOS7 中中断了。似乎当它尝试在第二次推送中设置动画时,应用程序冻结了。在深入挖掘之后,我想出了在委托实现中按以下方式推送第二个视图控制器的解决方案。

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

这似乎解决了问题,但我想知道是否有人遇到过类似的事情并且对到底发生了什么有更好的解释。

【问题讨论】:

  • 您究竟想通过这 3 个步骤实现什么目标?在我看来,你可能想多了。为什么不简单地使用 navigationController.viewControllers = @[A, B, C] ?
  • 我应该澄清一下,我想对一系列推送进行动画处理,以便为用户提供视图层次结构的上下文。因此,您的方法不会产生完全相同的结果。尽管我的示例有三个视图控制器,但我的用例是两个视图控制器。

标签: ios objective-c animation uinavigationcontroller ios7


【解决方案1】:

我不确定你遇到了什么问题。我创建了一个具有导航控制器和其他四个控制器的测试应用程序。第一个控制器有一个按钮可以推送到第二个控制器,即 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];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2018-01-05
    • 1970-01-01
    • 2022-12-26
    • 2016-11-27
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多