首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当推送多个详细视图控制器时,“对DetailViewController的开始/结束外观转换的不平衡调用”

当推送多个详细视图控制器时,“对DetailViewController的开始/结束外观转换的不平衡调用”
EN

Stack Overflow用户
提问于 2012-02-01 07:11:48
回答 8查看 80.8K关注 0票数 67

我有一个包含表视图的视图控制器,可以选择表中的项并适当地创建一个详细视图控制器。

表中的项目表示可以具有与其关联的基于时间的触发器的项目,并且为每个项目安排本地通知,如果本地通知到期时应用程序在前台,则自动显示项目的详细信息视图。

我有一个问题,当两个通知同时到期时,会导致视图不能正确显示,此外,控制台日志还会显示:“不平衡的调用到开始/结束外观转换的NNN”,其中NNN是我的详细视图控制器。

表视图控制器的创建方式如下:

 self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil];
 UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
 self.window.rootViewController = navController;

当本地通知过期并调用didReceiveLocalNotification:时,应用程序使用NSNotifcationCenter postNotificationName:广播通知,表视图控制器正在侦听该通知。当表格视图控制器接收到该通知时,它会创建详细视图控制器,并将其推送到堆栈,如下所示:

[self.navigationController pushViewController:detailViewController animated:YES]; 

我在某处读到,当视图控制器本身不在堆栈顶部时,如果视图控制器推送另一个视图控制器,可能会有问题-所以我认为这一定是问题所在,因为当表视图控制器收到第二个通知时,它将不再位于导航堆栈的顶部,因为当第一个通知到达时,它之前只是将一个细节视图控制器推送到堆栈上。

因此,我将推送代码更改为:

[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];

但这并没有什么不同。

所以我接下来认为可能会有问题,因为第一个细节视图控制器在第二个视图控制器被推送之前没有机会完全显示-所以我将应用程序的通知张贴从使用:

[[NSNotificationCenter defaultCenter] postNotificationName: 

[[NSNotificationQueue defaultQueue] enqueueNotification: postingStyle:NSPostWhenIdle]

这样推送就不会在app循环的同一次迭代中发生。但这没有区别,也没有试图引入对细节视图控件的推送的延迟:

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]; 
});

我不知道问题是什么,或者下一步该怎么做,有什么想法吗?

EN

回答 8

Stack Overflow用户

发布于 2013-07-03 13:07:17

‘开始/结束外观转换的不平衡调用’

表示在未完成上一个相关动画之前启动了一个动画。那么,在推送新的视图控制器之前,您会弹出任何视图控制器吗?或者可能正在跳转到root?如果是,请尝试在没有动画的情况下执行此操作。也就是说,

[self.navigationController popToRootViewControllerAnimated:NO];

看看这是否解决了问题,在我的例子中,这确实解决了问题。

票数 12
EN

Stack Overflow用户

发布于 2013-11-06 18:33:19

当您尝试在当前视图控制器完成显示之前显示新的视图控制器时,会发生“不平衡的调用以开始/结束外观转换”错误。

因此,在第一个完成动画之前,你必须确保你不会呈现一个新的VC。

在旧VC完成动画之前,使用didShowViewController和willShowViewController阻止呈现新VC。这是为用动画制作popViewController的backButtonAction准备的:是的。

- (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];
}
票数 7
EN

Stack Overflow用户

发布于 2013-04-06 05:05:06

当你多次尝试从堆栈中弹出一个VC时,也会发生这种情况。在我的例子中,弹出VC的方法被错误地调用了多次。一旦我解决了这个问题,这个问题就消失了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9088465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档