我在我的词典应用程序中使用自定义的容器视图控制器。基本上,容器视图控制器顶部包含一个自定义导航栏(不一个UINavigationBar
- 只有一个UIView
,后退和前进UIButtons
,一个{{ 1}},右侧是书签UISearchBar
,底部是标签栏控制器。
我的问题是:我使用后退和前进按钮在其中一个选项卡(UIButton
)中推送和弹出视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按下后退或前进按钮太快,我会在日志窗格中看到此消息,并且根本不显示某些屏幕:
对开始/结束外观转换的不平衡调用 < DefinitionViewController:0x8e5d230>。
环顾StackOverflow,我明白这是因为单击后退或前进按钮太快会调用活动选项卡中UINavigationController
的推/弹方法,但它不会让动画完成。 https://stackoverflow.com/a/17440074/855680
在没有动画的情况下推送或弹出视图控制器可以解决问题,但我确实希望保留动画。我该如何处理这个问题?我查看了UINavigatonController
类引用,看看是否有任何委托方法或属性表明它在动画中间,但似乎没有。
答案 0 :(得分:2)
我自己修好了。解决方案是在容器视图控制器中创建一个属性,指示UINavigationController
转换动画是否仍在发生:
@property (nonatomic, getter = isStillAnimatingTransition) BOOL stillAnimatingTransition;
现在,对于我推入UIViewController
的所有UINavigationController
类,我将此标记设置为每个视图控制器中的YES
或NO
{{ 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;
}