HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 在viewDidAppear中推送视图控制器不起作用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
重现步骤

1)创建导航控制器和3个视图控制器.

firstViewController.m:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"DEBUG: first screen did appear");
    [self.navigationController pushViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"secondScreen"] animated:NO];
}

secondViewController.m:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"DEBUG: second screen did appear");
    [self.navigationController pushViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"thirdScreen"] animated:YES];
}

thirdViewController.m:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"DEBUG: third screen did appear");
}

2)使导航控制器的根视图控制器成为firstViewController(故事板中的firstScreen).

3)运行应用程序并注意导航栏已更新以显示第三个屏幕的标题,但仍显示第二个屏幕的内容.

笔记

我已经尝试过使用UINavigationControllerDelegate的 – (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)动画方法,因为它似乎在viewDidAppear方法之后触发,但它没有解决问题.

我还尝试手动设置导航控制器的viewControllers,认为它会跳过一些“这个视图控制器处于活动状态”逻辑并允许有问题的推送工作,但事实并非如此.

我能想到的唯一解决方案是使用延迟调用在secondViewController.m中推送所需的视图控制器:

dispatch_after(dispatch_time(DISPATCH_TIME_Now,250 * USEC_PER_SEC),dispatch_get_main_queue(),^{
    [self.navigationController pushViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"thirdScreen"] animated:YES];
});

问题

我想知道为什么这不能按预期工作.基于我在半相关问题上看到的其他一些SO答案,它可能与运行循环有关,但我无法确认或否认(似乎可能因为调度推送允许它工作).

有更多知识/经验的人能够启发我吗?

谢谢!

解决方法

这是个有趣的问题.我非常有信心,如果要设置动画:在firstViewController.m中推送第二个视图控制器时为YES,最终的UI状态将如预期一样,第三个屏幕的内容标题都正确可见.

但是,这显然不是您想要的过渡效果.为什么动画旗帜无论如何都会产生不同的影响?

如果你在-viewDidAppear中设置一个断点:并查看堆栈跟踪,对于动画== YES和动画== NO的情况,它看起来就像动画== NO,-viewDidAppear:在视图中被调用UINavigationController中的布局操作.我的钱是因你的最终观点看起来不正确;现在执行推送将在前一次推送完成之前执行.

这就是运行循环虑因素的来源.我们希望UINavigationController的视图布局(在主运行循环的当前循环周期中发生)在请求下一次推送之前完成.实现这一目标的一种简单方法是将推送排队到主运行循环的下一个循环.延迟肯定会起作用(我相信延迟0足以延迟到下一个运行循环周期,所以你可以尝试用0替换250 * USEC_PER_SEC).另一种方法是将操作分派到主队列:

dispatch_async(dispatch_get_main_queue(),^{
    [self.navigationController pushViewController:[self.storyboard instantiateViewControllerWithIdentifier:@"thirdScreen"] animated:YES];
});

所以我的回答是一种推测,但基于一些证据.在执行UINavigationController转换时,感觉有点令人不满意,-viewDidAppear:仅表示动画时转换的真实结束,但情况似乎确实如此.

大佬总结

以上是大佬教程为你收集整理的ios – 在viewDidAppear中推送视图控制器不起作用全部内容,希望文章能够帮你解决ios – 在viewDidAppear中推送视图控制器不起作用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。