Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UINavigationController转换动画触发过快_Iphone_Ios_Objective C_Ipad_Cocoa Touch - Fatal编程技术网

Iphone UINavigationController转换动画触发过快

Iphone UINavigationController转换动画触发过快,iphone,ios,objective-c,ipad,cocoa-touch,Iphone,Ios,Objective C,Ipad,Cocoa Touch,我正在字典应用程序中使用定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOTaUINavigationBar——只是一个带有前后ui按钮的UIView、一个UISearchBar、一个书签UIButton),以及一个底部的选项卡栏控制器 我的问题是:我使用后退和前进按钮来按下和弹出其中一个选项卡(aUINavigationController)中的视图控制器,以便用户可以浏览字典浏览历史记录。但是,如果我按后退或前进按钮太快,我会在日志窗格中看到此消息,并且一些屏幕根本

我正在字典应用程序中使用定制的容器视图控制器。基本上,容器视图控制器在顶部包含一个自定义导航栏(NOTa
UINavigationBar
——只是一个带有前后
ui按钮的
UIView
、一个
UISearchBar
、一个书签
UIButton
),以及一个底部的选项卡栏控制器

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

对开始/结束外观转换的不平衡调用

环顾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找到更多关于委派协议的参考资料 :