【发布时间】:2020-05-30 13:02:37
【问题描述】:
我有一个旧应用程序正在尝试更新以修复 iOS 13 中出现的错误。不幸的是,更新到 iOS 13 SDK 触发了其他几个错误。我已经全部修复了,主要是通过调整 info.plist 文件,除了这一件事。
我使用标准的UINavigationController 来显示一系列表格视图。当我单击表格行时,会触发 pushViewController:animated: 转到下一个视图。这看起来很好并且动画正确,但控制台会为我要离开的视图显示消息“不平衡调用开始/结束外观转换”。
当我单击后退按钮或在视图上从左向右滑动时,上一个视图会立即出现,没有动画。控制台再次为传出视图显示警告“开始/结束外观转换的不平衡调用”。导航栏动画正确,从旧视图淡入新视图,但视图没有动画。如果我通过滑动导航回来,我会得到相同的行为。实际上,如果我非常缓慢地向后滑动,则视图会在开始滑动时立即弹出,而不是在我移动手指时慢慢将旧视图拖入到位。
我发现很多帖子在将导航控制器放置在标签栏控制器中时会发生这种情况,我没有这样做,或者以编程方式推送视图时,我没有这样做。我检查了viewWillAppear 或viewDidAppear 的每个覆盖都调用了它的超类,并且我没有不匹配的调用(从viewWillAppear 调用super viewDidAppear,反之亦然)。
我没有使用故事板,只是使用 pushViewController 方法的普通旧目标 C 代码。我确实以编程方式设置导航控制器并将其放置在容器视图控制器中,如下所示:
MainMenu *rootViewController = [[MainMenu alloc] initWithNibName:@"MainMenu" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
self.navigationController.delegate = self;
[self addChildViewController:self.navigationController];
[self.navigationController didMoveToParentViewController:self];
[self.view addSubview:self.navigationController.view];
当我在 iOS 12 设备上运行该应用程序时,它运行良好。该问题仅出现在 iOS 13 设备上。我有另一个应用程序,它使用相同的结构,最初是在同一时间构建的,但会针对 iOS 版本定期更新,它没有问题。我已经比较了我能想到的每个文件和设置,但找不到两个应用程序之间的相关差异。
有其他人在更新 iOS 13 时看到过这个吗?
更新
为了消除容器视图中的任何问题,我暂时更改了应用程序,将导航控制器直接放入窗口中。所以我现在在application:DidFinishLaunchingWithOptions: 中有这个:
MainMenu *mainMenu = [[MainMenu alloc] initWithNibName:@"MainMenu" bundle:nil];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:mainMenu];
[self.window addSubview:self.navigationController.view];
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
然后,为了消除我正在导航到的视图控制器的任何问题,我制作了一个只包含一个空视图的新笔尖,在 MainMenu 中,当单击表格行时,我运行以下代码:
UIViewController *viewController = [[UIViewController alloc] initWithNibName:@"Empty" bundle:nil];
[self.appDelegate.navigationController pushViewController:viewController animated:YES];
然后我单击左上角的系统提供的后退按钮,MainMenu 重新出现,但没有动画和相同的控制台消息。我觉得这与我的项目设置有关,因为代码非常简单明了。我在这个项目的 project.pbxproj 文件和另一个没有问题的项目之间运行了一个差异,编译器设置或位码等内容存在差异,但似乎与这个问题无关。
【问题讨论】:
-
这可能无关紧要,但强烈提及您的孩子
self.navigationController是危险的。参考是它在你的childViewControllers;做第二个强有力的参考可能会在以后给你带来麻烦。
标签: ios objective-c uinavigationcontroller