Ios &引用;对DetailViewController“开始/结束外观转换的调用不平衡”;推送多个局部视图控制器时
我有一个视图控制器,它包含一个表视图,可以选择表中的项目,并创建一个详细视图控制器 表中的项目表示可以具有与之关联的基于时间的触发器的项目,并为每个项目安排本地通知,如果本地通知过期时应用程序位于前台,则会自动显示该项目的详细信息视图 我有一个问题,当两个通知同时过期时会出现,这会导致视图无法正确显示,此外还有控制台日志: “对NNN开始/结束外观转换的不平衡调用”,其中NNN是我的详细视图控制器 表视图控制器的创建如下所示:Ios &引用;对DetailViewController“开始/结束外观转换的调用不平衡”;推送多个局部视图控制器时,ios,Ios,我有一个视图控制器,它包含一个表视图,可以选择表中的项目,并创建一个详细视图控制器 表中的项目表示可以具有与之关联的基于时间的触发器的项目,并为每个项目安排本地通知,如果本地通知过期时应用程序位于前台,则会自动显示该项目的详细信息视图 我有一个问题,当两个通知同时过期时会出现,这会导致视图无法正确显示,此外还有控制台日志: “对NNN开始/结束外观转换的不平衡调用”,其中NNN是我的详细视图控制器 表视图控制器的创建如下所示: self.tableViewController = [[Tabl
self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
self.window.rootViewController = navController;
当本地通知过期并调用didReceiveLocalNotification:时,应用程序将使用NSNotificationCenter postNotificationName:广播通知,并且表视图控制器正在侦听该通知。当表视图控制器收到该通知时,它将创建详图视图控制器并将其推送到堆栈,如下所示:
[self.navigationController pushViewController:detailViewController animated:YES];
我在某个地方读到,如果一个视图控制器在其自身不在堆栈顶部时推另一个视图控制器,则可能会出现问题-因此我认为这一定是问题所在,因为当表视图控制器接收到第二个通知时,它将不再位于导航堆栈的顶部,因为在第一个通知到达时,它之前刚刚将详细视图控制器推送到堆栈上
因此,我将推送代码更改为:
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
但这没什么区别
因此,我接下来认为可能会有问题,因为第一个细节视图控制器在第二个细节视图控制器之前没有机会完全显示
视图控制器被推送-因此我更改了应用程序的通知发布,不再使用:
[[NSNotificationCenter defaultCenter] postNotificationName:
到
这样推送就不会在应用程序循环的同一个iTreaction中发生。但这没有任何区别,也没有尝试延迟推送详图视图控件:
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
});
我不知道问题是什么,也不知道下一步该做什么,有什么想法吗
“开始/结束外观转换的不平衡调用”
在当前视图控制器完成显示之前尝试显示新的视图控制器时发生。您可以通过在ViewWillDisplay中导航来复制它
基本上,您试图几乎同时将两个视图控制器推送到堆栈上。建议您在tableview控制器中维护一个队列,该队列维护需要显示的详细视图列表。每次将一个推送到堆栈上,并在退出当前详细视图时检查是否有任何排队的详细视图需要显示
这种导航方式会让用户感到困惑。最好让你的细节视图支持多个项目。
当你尝试不止一次从堆栈中弹出VC时,也会发生这种情况。在我的例子中,弹出VC的方法被错误地调用了多次。一旦我解决了这个问题,问题就消失了
“开始/结束外观转换的不平衡调用” 表示动画在最后一个相关动画未完成之前启动。那么,在推新的视图控制器之前,是否要弹出任何视图控制器?或者可能正在生根发芽?如果是,请尝试在没有动画的情况下执行此操作。i、 e[self.navigationController popToRootViewControllerAnimated:NO];
看看这是否解决了问题,在我的例子中,这就解决了问题。“开始/结束外观转换的不平衡调用”错误发生在您尝试在当前视图控制器完成显示之前显示新的viewcontroller时
所以,你必须确保在第一个VC完成动画之前,你不会展示一个新的VC 使用didShowViewController和willShowViewController在旧VC完成动画之前阻止呈现新VC。是为backButtonAction制作带有动画的popViewController:是
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[self.myNavView.backButton addTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[self.myNavView.backButton removeTarget:self action:@selector(backButtonAction) forControlEvents:UIControlEventTouchUpInside];
}
看看这些重载: 如果它们是空的,则注释它们并重建
- (void) beginAppearanceTransition:(BOOL) isAppearing animated:(BOOL)animated {}
- (void) becomeActive:(NSNotification *) notification {}
实际上,您需要等待推送动画结束。因此,您可以委托UINavigationController并防止在动画结束前推送
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
waitNavigation = NO;
}
-(void)showGScreen:(id)gvc{
if (!waitNavigation) {
waitNavigation = YES;
[_nav popToRootViewControllerAnimated:NO];
[_nav pushViewController:gvc animated:YES];
}
}
您正在使用外观代理功能吗 我发现这个特性很有问题,上次我有一个 “对开始/结束外观转换的不平衡调用” 我通过删除
[[UITextField外观]…]
方法解决了这个问题
希望这能有所帮助在我的例子中,我实现了一个自定义容器视图控制器,并且在交换子视图控制器时收到了警告,尽管事实上我同时调用了
和endAppearanceTransition()
在进入和退出视图控制器上
我通过对进入视图控制器的方法调用重新排序来解决这个问题;发件人:
addChildViewController(newContent)
targetContainer.insertSubview(newContent.view, at: 0)
newContent.beginAppearanceTransition(true, animated: animated)
// Called AFTER adding subview
致:
希望这有助于某人在我的例子中,问题是我在已经呈现的viewController(全屏工作表)上呈现viewController(警报)。 UIKit沿着viewController父链而不是呈现链,因此在到达呈现和窗口根视图控制器时存在不匹配。
在这些情况下,手动调用beginAppearanceTransition会使消息消失,不过这似乎是一个症状补丁,而不是错误的真正补救措施。您可以在
-[UIViewController _endAppearanceTransition:]
从哪里UIKit打印
"Unbalanced calls to begin/end appearance transitions for %@."
这可以帮助您进行调查如上述答案所述,当我们在上一个视图控制器完成加载之前尝试推送视图控制器时,会出现此错误,因此一种解决方案是尝试推送控制器a
-[UIViewController _endAppearanceTransition:]
"Unbalanced calls to begin/end appearance transitions for %@."