UINavigationController过渡animation触发得太快
我在我的字典应用程序中使用定制的容器视图控制器。 基本上,容器视图控制器包含顶部的自定义导航栏( 不是一个UINavigationBar
只是一个带有后退和前进UIButtons
的UIView
,一个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
,我把这个标志设置为YES
或NO
在每个视图控制器的viewWillDisappear
和viewDidAppear
方法,如下所示:
- (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; }