<UITabBarController: 0x197870>的开始/结束出现转换调用不平衡。

133

我在SO上阅读到另一个用户遇到类似的错误,但这个错误和那个不同。

当我最初添加一个视图控制器时,我收到了这个消息:

Unbalanced calls to begin/end appearance transitions for 
<UITabBarController: 0x197870>

应用程序的结构如下:

我使用了一个包含5个视图控制器的标签栏控制器。在初始显示标签中,我调用一个新的视图控制器作为应用程序的介绍。

我使用以下代码来调用介绍视图控制器:

IntroVC *vc = [[IntroVC alloc] init];
[self presentModalViewController:vc animated:YES];
[vc release]; 

在这个IntroVC视图控制器显示之后,出现了上述错误。

p.s. 我正在使用xCode 4.2&iOS 5.0 SDK,开发iOS 4.3应用程序。


嗨,Shivan,我和你有同样的问题。但是在查看下面的答案后,我仍然无法解决它。请问你在哪里调用了介绍视图控制器? - ZYiOS
24个回答

2

我遇到了一个第三方代码的问题。在自定义的TabBarController类中,有人忘记在viewWillAppear和viewWillDisappear中设置super。

- (void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    // code...
}

or

- (void) viewWillDisappear:(BOOL)animated {

    [super viewWillDisappear:animated];
    // code...
}

1
在Swift 2+中,以下代码适用于我:
在Storyboard中,我有一个UITabBarViewController,并且我的selectedIndex属性如下:

enter image description here

但是我将其删除,并在我的初始类的viewDidLoad方法中添加,如下所示:
override func viewDidLoad() {
   super.viewDidLoad()
   self.tabBarController?.selectedIndex = 2
}

我希望我能帮助到某个人。

1
我遇到了相同的问题,想要发表一篇帖子以便其他人遇到类似情况时可以参考。在我的情况下,我将长按手势识别器附加到了我的UITableViewController上。
UILongPressGestureRecognizer *longPressGesture = [[[UILongPressGestureRecognizer alloc]
                                                   initWithTarget:self
                                                   action:@selector(onLongPress:)]
                                                  autorelease];
[longPressGesture setMinimumPressDuration:1];
[self.tableView addGestureRecognizer:longPressGesture];

在我的onLongPress选择器中,我启动了下一个视图控制器。

- (IBAction)onLongPress:(id)sender {

    SomeViewController* page = [[SomeViewController alloc] initWithNibName:@"SomeViewController" bundle:nil];

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

    [page release];

}

在我的情况下,我收到了错误信息,因为长按识别器触发了多次,结果导致我的“SomeViewController”被多次推入堆栈。
解决方案是添加一个布尔值,指示SomeViewController何时被推入堆栈。当我的UITableViewController的viewWillAppear方法被调用时,我将布尔值重新设置为NO。

1
我发现,如果你正在使用故事板,你需要将显示新视图控制器的代码放在viewDidAppear中。这也会消除“不建议在分离的视图控制器上呈现视图控制器”的警告。

1
我遇到了同样的错误。我有一个选项卡栏,有3个项目,我无意识地试图在我的选项卡栏的项目2中调用项目1的根视图控制器,使用performSegueWithIdentifier
结果是,在几秒钟后调用了视图控制器,并返回到项目2的根视图控制器,并记录了该错误。
显然,您不能将一个项目的根视图控制器调用另一个项目。
因此,我使用了[self.parentViewController.tabBarController setSelectedIndex:0];而不是performSegueWithIdentifier 希望能对某人有所帮助。

1
尝试展示通过闭包进行惰性初始化的UINavigationController时,会显示此错误。

0
对我来说,这个错误是因为在设置根视图控制器时,我没有在类的上层声明UIWindow
            rootViewController?.showTimeoutAlert = showTimeOut
            let navigationController = SwipeNavigationController(rootViewController: rootViewController!)
            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window?.rootViewController = navigationController
            self.window?.makeKeyAndVisible()

如果我在那段代码块中尝试声明window而不是引用self,那么我将收到错误提示。

0
我曾经遇到过同样的问题。在开发时,我想要跳过一些界面,所以我在viewDidLoad中通过调用一个选择器方法来从一个视图控制器导航到另一个视图控制器。
问题在于,在转换到另一个视图控制器之前,我们应该让当前的视图控制器完成过渡。
这个解决方案解决了我的问题:延迟是必须的,以便在转换到另一个视图控制器之前,让当前的视图控制器完成过渡。
self.perform(#selector(YOUR SELECTOR METHOD), with: self, afterDelay: 0.5)


0

实际上,您需要等待推送动画结束。因此,您可以委托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];
    }
}

当单元格被选中时,我调用它。实际上这取决于您。 - ymutlu

0

你需要确保在类中同时创建 -(void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated 和 -(void)endAppearanceTransition 方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接