对<UITabBarController:0x197870>的开始/结束外观转换的不平衡调用

Rap*_*tor 116 uitabbarcontroller ios4 ios

我读到了关于另一个用户遇到类似错误的 SO ,但是这个错误是在不同的情况下.

我最初添加View Controller时收到此消息:

Unbalanced calls to begin/end appearance transitions for 
<UITabBarController: 0x197870>
Run Code Online (Sandbox Code Playgroud)

该应用程序的结构如下:

我有一个5个标签的TabBarController链接到5个视图控制器.在初始显示选项卡中,我调出一个新的视图控制器来覆盖作为应用程序的介绍.

我使用此代码调用介绍视图控制器:

IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release]; 
Run Code Online (Sandbox Code Playgroud)

IntroVC视图控制器出现后,显示上述错误.

ps我正在使用xCode 4.2和iOS 5.0 SDK,开发iOS 4.3应用程序.

Jes*_*per 97

没有看到更多的周围代码,我无法给出明确的答案,但我有两个理论.

  1. 你不使用UIViewController指定初始化initWithNibName:bundle:.尝试使用它而不仅仅是init.

  2. 此外,self可能是标签栏控制器的视图控制器之一.始终从最顶层的视图控制器提供视图控制器,这意味着在这种情况下要求标签栏控制器代表视图控制器显示重叠视图控制器.您仍然可以将任何回调代理保留在实际视图控制器中,但您必须将标签栏控制器存在并关闭.

  • 您可以通过在应用程序初始化之前显示模态vc来生成此警告.即启动一个选项卡式应用程序模板应用程序,并在self.tabBarController之上呈现一个模态vc作为application:didFinishLaunching中的最后一行.出现警告.解决方案:让堆栈首先展开,在另一个方法中显示模态vc,使用performSelector withDelay:0.0调用. (170认同)
  • 而不是使用performSelectorWithDelay为零,而是在viewDidAppear而不是viewDidLoad或诸如此类的内容中执行此操作. (11认同)
  • 这是另一个问题解释为什么performSelector withDelay工作.http://stackoverflow.com/questions/1922517/how-does-performselectorwithobjectafterdelay-work (9认同)
  • #1为我解决了这个问题,我使用了initWithNibName:nil bundle:nil而不是init. (2认同)
  • danh 的解决方案对我有用,但我必须使用 0.1 而不是 0.0。 (2认同)

Pok*_*com 40

我通过将动画从YES更改为NO来修复此错误.

从:

[tabBarController presentModalViewController:viewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

至:

[tabBarController presentModalViewController:viewController animated:NO];
Run Code Online (Sandbox Code Playgroud)

  • 如果您不关心动画,这可以解决问题,但如果您需要动画:是,请尝试danh对已接受答案的评论:http://stackoverflow.com/questions/7886096/unbalanced-calls-to-begin-end -appearance跃迁换的UITabBarController-0X#comment11635438_7886348 (4认同)
  • 仅供参考:presentModalViewController:animated:在iOS6中已弃用. (3认同)

Pet*_*isu 16

danh发布

您可以通过在应用程序初始化之前显示模态vc来生成此警告.即启动一个选项卡式应用程序模板应用程序,并在self.tabBarController之上呈现一个模态vc作为application:didFinishLaunching中的最后一行.出现警告.解决方案:让堆栈首先展开,在另一个方法中显示模态vc,使用performSelector withDelay调用:0.0

尝试将方法移动到viewWillAppear并保护它,以便它只执行一次(建议设置属性)


mll*_*llm 6

在许多情况下的另一种解决方案是通过执行以下操作来确保UIViewControllers 之间的过渡发生不合适的过程(如初始化期间)完成之后:

__weak MyViewController *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf presentViewController:vc animated:YES];
});
Run Code Online (Sandbox Code Playgroud)

这对于pushViewController:animated:等也很普遍。