self.navigationController.interactiveepogesturerecognizer.enabled=否;不在iOS 8中工作

self.navigationController.interactiveepogesturerecognizer.enabled=否;不在iOS 8中工作,ios,objective-c,xcode,ios8,Ios,Objective C,Xcode,Ios8,我想在滑动viewcontroller时禁用弹出手势,但以下几行在iOS 8中不起作用: self.navigationController.interactivePopGestureRecognizer.enabled = NO; 提前感谢在要禁用viewcontroller的视图中,添加以下行: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if ([self.navigati

我想在滑动viewcontroller时禁用弹出手势,但以下几行在iOS 8中不起作用:

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

提前感谢

在要禁用viewcontroller的视图中,添加以下行:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

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

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }

}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    return NO;
}

我在我的项目中使用此解决方案,它仅禁用InteractiveProgEstureRecognitor,并允许您使用其他手势识别器

- (void)viewDidLoad {

    [super viewDidLoad];

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        self.navigationController.interactivePopGestureRecognizer.delegate = self;

    }

}


- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    if ([gestureRecognizer isEqual:self.navigationController.interactivePopGestureRecognizer]) {

        return NO;

    } else {

        return YES;

    }

}
下面的解决方案

- (void)viewWillAppear:(BOOL)animated {
      [super viewWillAppear:animated];

      __weak id weakSelf = self;
      self.navigationController.interactivePopGestureRecognizer.delegate = weakSelf;  }
导航控制器在其视图上安装此手势识别器,并使用它从导航堆栈中弹出最顶部的视图控制器。您可以使用此属性检索手势识别器,并将其与用户界面中其他手势识别器的行为联系起来。将手势识别器连接在一起时,确保它们同时识别自己的手势,以确保您的手势识别器有机会处理事件

通常我们需要在手动添加导航栏或自定义导航控制器时实现

快速版本 在RootViewController上添加协议UIgestureRecognitizerDelegate和Views将显示添加:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.interactivePopGestureRecognizer!.delegate =  self }
我认为最简单的方法是在上面。 不应在viewDidLoad()中直接启用手势
但是,您可以在viewdide()之后更改它的状态。你知道这是在之后的,:-D

你确定吗?当我在iOS 8中测试上述代码时,它起作用了。self.navigationController.interactiveepopgestrerecognizer.enabled=NO;不起作用,可能是iOS 8的一个bug你能解决iOS 8中的bug吗?我检查它对我不起作用。使用发布的代码,我可以成功禁用interactivePopGesture,而使用self.navigationController.InteractivePopgestureRecognitizer.enabled=否则不会禁用它。如果这不起作用,并且您是英国人,请确保您没有使用英语拼写。;)这是按照上面发布的iOS 8解决方案工作的,但是没有编译器警告,所以我不确定为什么其他人投了反对票,请评论原因。这似乎不是一个完整的解决方案。如果是的话,那么解释它为什么有效。如果不是,那么请说明您正在修改的答案。如何在swift中写入此内容获得
无法将类型(VC)的值分配给类型“UIgestureRecognitizerDelegate”
这对我来说很有效,应该是可接受的答案@Userich,干得好!这是一个很好的解决方案。你不需要这样做。self.navigationController.interactiveepogesturerecognizer.enabled=否;达拉,已经提供了多个答案,您能选择一个作为接受答案吗?所有答案都不适用于iOS 8:(尝试或不尝试这样做。首先,不清楚这将如何解决问题。它会禁用,然后在一段时间后启用。您试图做什么?其次,使用延迟是一种糟糕的编程实践。无法保证给定的延迟足够长,但不会太长-可能在安装识别器之前发生,或者在吃得足够多,用户可以在代码运行之前开始刷卡。不要使用延迟;而是使用苹果提供的方法,
viewwillbeen
viewdidebeen
,正如在回答之前很久发布的其他回答中所示。
- (void)viewDidLoad {
    [super viewDidLoad];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    });

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    });
}