23

私のアプリには、さまざまなコントローラーがあります。controller1 をナビゲーション コントローラーに押して、スワイプして戻ると、すべて正常に動作します。しかし、ナビゲーション コントローラー 1 を押し、コントローラー 1 にコントローラー 2 を押して、スワイプして戻そうとすると、アプリケーションがフリーズします。戻るボタンで戻ると、すべて正常に動作します。

どうすれば問題をキャッチできますか?

4

9 に答える 9

38

スワイプしてポップするジェスチャーを使用すると、インターフェイスがフリーズするという同様の問題がありました。私の場合、問題は controller1.viewDidAppear にあり、スワイプジェスチャーを無効にしていました: self.navigationController.interactivePopGestureRecognizer.enabled = NO. そのため、ユーザーが contorller2 からスワイプバックを開始すると、controller1.viewDidAppear がトリガーされ、ジェスチャが無効になりました。

ジェスチャ認識機能を無効にする代わりに、self.navigationController.interactivePopGestureRecognizer.delegate = selfcontroller1 に設定して を実装することで、これを解決しました。gestureRecognizerShouldBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
            gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
        return NO;
    }
    return YES;
}
于 2014-01-29T07:20:15.317 に答える
19

私の解決策は、デリゲートをナビゲーション コントローラーに追加することでした。次に、ルート ビュー コントローラーでのみポップ ジェスチャ認識機能を無効にします。YMMV。

#pragma mark - UINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    BOOL isRootVC = viewController == navigationController.viewControllers.firstObject;
    navigationController.interactivePopGestureRecognizer.enabled = !isRootVC;
}
于 2015-01-21T05:06:17.677 に答える
3

スウィフト 4:

デリゲートを設定し、

self.navigationController?.interactivePopGestureRecognizer?.delegate = self

デリゲート メソッドを実装し、

extension YourVC: UIGestureRecognizerDelegate{
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer && conditionToDisableTheGesture {
            return false
        }else{
            return true
        }
    }

}
于 2019-02-26T12:33:39.053 に答える
0

これを試してみることをお勧めします。これは私にとって完璧に機能します。インタラクティブなスワイプは引き続き楽しめます。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
  if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)] &&
      gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
    if(self.navigationController.viewControllers.count<=1)
    {
      return NO;
    }
  }
  return YES;
}
于 2016-10-25T08:52:05.587 に答える
0

私は同じ問題を抱えていて、以下の解決策を見つけました。コントローラーの下に追加

#import <UIKit/UIKit.h>
@interface CBNavigationController : UINavigationController     <UIGestureRecognizerDelegate,UINavigationControllerDelegate>
@end

#import "CBNavigationController.h"
@interface CBNavigationController ()
@end
@implementation CBNavigationController
- (void)viewDidLoad
{
NSLog(@"%s",__FUNCTION__);
__weak CBNavigationController *weakSelf = self;

if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
    self.interactivePopGestureRecognizer.delegate = weakSelf;
    self.delegate = weakSelf;
}
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
NSLog(@"%s",__FUNCTION__);

if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    self.interactivePopGestureRecognizer.enabled = NO;

[super pushViewController:viewController animated:animated];
}

#pragma mark UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController
   didShowViewController:(UIViewController *)viewController
                animated:(BOOL)animate
{
NSLog(@"%s",__FUNCTION__);

// Enable the gesture again once the new controller is shown

if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
    self.interactivePopGestureRecognizer.enabled = YES;
}
@end

以下のリンクを参照できます

http://keighl.com/post/ios7-interactive-pop-gesture-custom-back-button/

于 2014-02-26T05:18:18.377 に答える