0

我在我的字典应用程序中使用定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOT a UINavigationBar--just a UIViewwith back and forward UIButtons, aUISearchBar和一个书签UIButton在右侧),以及底部的标签栏控制器。

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

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

环顾 StackOverflow,我了解到这是因为单击后退或前进按钮太快调用了UINavigatonController活动选项卡中的 push/pop 方法,但它并没有让动画完成。https://stackoverflow.com/a/17440074/855680

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

4

2 回答 2

2

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

@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];
}

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

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

- (void)forwardButtonClicked
{
    if (!self.isStillAnimatingTransition) {
        // Do whatever.
    }
}
于 2013-11-02T02:19:57.420 回答
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;
}

您可以从苹果https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UINavigationControllerDelegate/navigationController找到有关委托协议的更多参考资料 :willShowViewController:animated :

于 2014-04-03T07:29:42.893 回答