UINavigationController过渡animation触发得太快

我在我的字典应用程序中使用定制的容器视图控制器。 基本上,容器视图控制器包含顶部的自定义导航栏( 不是一个UINavigationBar只是一个带有后退和前进UIButtonsUIView ,一个UISearchBar和一个书签UIButton )和底部的标签栏控制器。

我的问题是这样的:我使用后退和前进button来推送和popup视图控制器在其中一个选项卡( UINavigationController ),以便用户可以浏览字典浏览历史logging。 但是,如果我太快按下后退或前进button,我会在日志窗格中看到此消息,并且一些屏幕完全不显示:

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

回顾一下StackOverflow,我明白这是因为点击后退或前进button太快会调用活动选项卡中的UINavigatonController的push / pop方法,但它不会让animation完成。 https://stackoverflow.com/a/17440074/855680

推动或popup视图控制器没有animation解决了这个问题,但我确实想保持animation。 我怎样才能解决这个问题? 我查看了UINavigationController类的引用,看是否有任何委托方法或属性指示它在animation的中间,但似乎没有。

修正它自己。 解决的办法是在我的容器视图控制器中创build一个属性,指出UINavigationController过渡animation是否仍在发生:

 @property (nonatomic, getter = isStillAnimatingTransition) BOOL stillAnimatingTransition; 

现在,对于所有的UIViewController类,我推入到UINavigationController ,我把这个标志设置为YESNO在每个视图控制器的viewWillDisappearviewDidAppear方法,如下所示:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.containerViewController.stillAnimatingTransition = NO; } - (void)viewWillDisappear:(BOOL)animated { self.containerViewController.stillAnimatingTransition = YES; [super viewWillDisappear:animated]; } 

而我的容器视图控制器只允许执行后退和前进button,如果animation标志设置为NO ,如下所示:

 - (void)backButtonClicked { if (!self.isStillAnimatingTransition) { // Do whatever. } } - (void)forwardButtonClicked { if (!self.isStillAnimatingTransition) { // Do whatever. } } 

也许你可以利用UINavigationControllerDelegate类并处理那里的事件。

在持有导航控制器的主类中,将委托设置为您自己并处理那里的交互。

即在.h文件中:

 @interface yourClass : UIViewController <UINavigationControllerDelegate> { UINavigationController *content; } 

然后在.m文件中:

  content = [[UINavigationController alloc] initWithRootViewController:yourRootViewController]; content.delegate = self; 

之后,您可以通过以下function收听过渡事件,并相应地设置您的animation标志。

 - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { stillAnimatingTransition = NO; } - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { stillAnimatingTransition = YES; } 

你可以从苹果https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UINavigationControllerDelegate/navigationControllerfind更多关于委托协议的参考:willShowViewController:animation