Iphone UINavigationController转换动画触发过快
我正在字典应用程序中使用定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOTaIphone UINavigationController转换动画触发过快,iphone,ios,objective-c,ipad,cocoa-touch,Iphone,Ios,Objective C,Ipad,Cocoa Touch,我正在字典应用程序中使用定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOTaUINavigationBar——只是一个带有前后ui按钮的UIView、一个UISearchBar、一个书签UIButton),以及一个底部的选项卡栏控制器 我的问题是:我使用后退和前进按钮来按下和弹出其中一个选项卡(aUINavigationController)中的视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按后退或前进按钮太快,我会在日志窗格中看到此消息,并且一些屏幕根本
UINavigationBar
——只是一个带有前后ui按钮的UIView
、一个UISearchBar
、一个书签UIButton
),以及一个底部的选项卡栏控制器
我的问题是:我使用后退和前进按钮来按下和弹出其中一个选项卡(aUINavigationController
)中的视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按后退或前进按钮太快,我会在日志窗格中看到此消息,并且一些屏幕根本不会出现:
对开始/结束外观转换的不平衡调用
环顾StackOverflow,我了解到这是因为点击后退或前进按钮太快会调用活动选项卡中的UINavigatonController
的push/pop方法,但它不会让动画完成
在没有动画的情况下按下或弹出视图控制器可以解决问题,但我确实希望保留动画。我如何处理这个问题?我查看了<代码> UINavigationController <代码>类引用,看看是否有任何委托方法或属性指示它处于动画的中间,但似乎没有任何。 修复它自己。解决方案是在我的容器视图控制器中创建一个属性,该属性指示UINavigationController
转换动画是否仍在发生:
@property (nonatomic, getter = isStillAnimatingTransition) BOOL stillAnimatingTransition;
现在,对于我推送到UINavigationController
中的所有UIViewController
类,我在每个视图控制器的视图将消失和viewdideaked
方法中将此标志设置为YES
或NO
,如下所示:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.containerViewController.stillAnimatingTransition = NO;
}
- (void)viewWillDisappear:(BOOL)animated
{
self.containerViewController.stillAnimatingTransition = YES;
[super viewWillDisappear:animated];
}
- (void)backButtonClicked
{
if (!self.isStillAnimatingTransition) {
// Do whatever.
}
}
- (void)forwardButtonClicked
{
if (!self.isStillAnimatingTransition) {
// Do whatever.
}
}
如果动画标志设置为NO
,则my container view controller仅允许执行后退和前进按钮,如下所示:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
self.containerViewController.stillAnimatingTransition = NO;
}
- (void)viewWillDisappear:(BOOL)animated
{
self.containerViewController.stillAnimatingTransition = YES;
[super viewWillDisappear:animated];
}
- (void)backButtonClicked
{
if (!self.isStillAnimatingTransition) {
// Do whatever.
}
}
- (void)forwardButtonClicked
{
if (!self.isStillAnimatingTransition) {
// Do whatever.
}
}
也许您可以利用UINavigationControllerDelegate类并在那里处理事件
在包含导航控制器的主类中,将委托设置为您自己,并在那里处理交互
i、 e.在.h文件中:
@interface yourClass : UIViewController <UINavigationControllerDelegate> {
UINavigationController *content;
}
之后,您可以通过以下函数收听转换事件,并相应地设置动画标志
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
stillAnimatingTransition = NO;
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
stillAnimatingTransition = YES;
}
您可以从apple找到更多关于委派协议的参考资料
: