UINavigationController转换动画触发太快

时间:2013-10-21 16:35:36

标签: iphone ios objective-c ipad cocoa-touch

我在我的词典应用程序中使用自定义的容器视图控制器。基本上,容器视图控制器顶部包含一个自定义导航栏(一个UINavigationBar - 只有一个UIView,后退和前进UIButtons,一个{{ 1}},右侧是书签UISearchBar,底部是标签栏控制器。

我的问题是:我使用后退和前进按钮在其中一个选项卡(UIButton)中推送和弹出视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按下后退或前进按钮太快,我会在日志窗格中看到此消息,并且根本不显示某些屏幕:

  

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

环顾StackOverflow,我明白这是因为单击后退或前进按钮太快会调用活动选项卡中UINavigationController的推/弹方法,但它不会让动画完成。 https://stackoverflow.com/a/17440074/855680

在没有动画的情况下推送或弹出视图控制器可以解决问题,但我确实希望保留动画。我该如何处理这个问题?我查看了UINavigatonController类引用,看看是否有任何委托方法或属性表明它在动画中间,但似乎没有。

2 个答案:

答案 0 :(得分:2)

我自己修好了。解决方案是在容器视图控制器中创建一个属性,指示UINavigationController转换动画是否仍在发生:

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

现在,对于我推入UIViewController的所有UINavigationController类,我将此标记设置为每个视图控制器中的YESNO {{ 1}}和viewWillDisappear方法,如下所示:

viewDidAppear

如果动画标志设置为- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.containerViewController.stillAnimatingTransition = NO; } - (void)viewWillDisappear:(BOOL)animated { self.containerViewController.stillAnimatingTransition = YES; [super viewWillDisappear:animated]; } ,我的容器视图控制器只允许执行后退和前进按钮,如下所示:

NO

答案 1 :(得分:0)

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

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

即。在.h文件中:

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

然后在.m文件中:

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

之后,您可以通过以下功能收听转换事件,并相应地设置动画标记。

- (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找到有关委托协议的更多参考资料 https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UINavigationControllerDelegate/navigationController:willShowViewController:animated