在Swift中禁用滑回手势

一直在这里看了一会儿,但似乎无法find一个工作的解决scheme。

我试图在Swift中禁用滑动回到先前的视图手势。

我已经尝试了各种解决scheme,包括:

self.navigationController?.interactivePopGestureRecognizer.enabled = false 

 self.navigationController.interactivePopGestureRecognizer.delegate = self func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer!) -> Bool { return false; } 

有没有这样做的新方法或其他方法的作品?

您可以禁用它,但不会推荐,因为大多数iOS用户通过滑动返回,而按下后退button则不会。 如果你想禁用它,那么使用一个modal segue的继续,而不是一个传递不大的推动继续是更合理的。 如果你真的想摆脱滑动回去function,我只是禁用后退button,并在屏幕的右上angular有一个完成button。

 self.navigationController.navigationItem.backBarButtonItem.enabled = false 

以下是一个简单的方法来禁用和重新启用滑回。

Swift 3.x及以上

在viewDidLoad / willAppear / didAppear方法中添加:

 navigationController?.interactivePopGestureRecognizer?.isEnabled = false 

只要记住,如果你用viewDidLoad来做,那么下次你打开视图时,它可能不会被设置,取决于它是否保留在你的堆栈中。

除非您希望它保持closures状态,否则当视图通过willMove(toParentViewController:)willDisappearclosures时,您将需要重新打开它。 您的navigationController将在viewDidDisappear中为零,所以为时已晚。

 navigationController?.interactivePopGestureRecognizer?.isEnabled = true 

关于SplitViewControllers的特别注意事项:

正如CompC在注释中指出的那样,您将需要调用第二个导航控制器将其应用于详细视图,如下所示:

 navigationController?.navigationController?.interactivePopGe‌​stureRecognizer?.isE‌​nabled = false 

Swift 2.2&Objective-C

Swift版本2.x及以下版本:

 navigationController?.interactivePopGestureRecognizer?.enabled 

Objective-C的:

 self.navigationController.interactivePopGestureRecognizer.enabled 

我能够通过在gestureRecognizerShouldBegin中返回false来做到这一点

 class ViewController2: UIViewController, UIGestureRecognizerDelegate { ... override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. self.navigationController?.interactivePopGestureRecognizer.delegate = self } func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { return false } 

哈里或斯特凡的回答都没有错,但是这个更简洁。 只要把它放在viewDidLoad中,就完成了。

 if navigationController!.respondsToSelector(Selector("interactivePopGestureRecognizer")) { navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer) } 

编辑:

一个小的警告是,如果导航控制器是由另一个视图打开和导航控制器closures,那么你会得到一个EXC_BAD_ACCESS错误。 要修复它,你必须保存原始的UIGestureRecognizer,并在退出视图时将其放回原处。

宣布:

 private var popGesture: UIGestureRecognizer? 

在移除手势之前:

 popGesture = navigationController!.interactivePopGestureRecognizer 

然后closures视图时:

 If popGesture != nil { navigationController!.view.addGestureRecognizer(popGesture!) } 

我通常确保在尽可能多的位置启用轻扫,即使添加了自定义的手势识别器以将其添加到模态屏幕。 然而,对于我的应用程序中的身份validation和下载过程,我使用模态导航控制器启动进程,然后为每个下一步推送视图。 但是,一旦完成,我想阻止他们备份到身份validation屏幕。

对于这种情况我一直在使用:

 navigationController?.interactivePopGestureRecognizer?.isEnabled = false navigationItem.hidesBackButton = true 

在最后的屏幕上viewWillAppear() 。 你可以在viewWillDisappear()取消这些,如果你推动另一个视图,并在那里需要它们。

为目标-c

 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:true]; self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 

RowanPD的Swift 4的逻辑

 private var popGesture: UIGestureRecognizer? override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if navigationController!.responds(to: #selector(getter: UINavigationController.interactivePopGestureRecognizer)) { self.popGesture = navigationController!.interactivePopGestureRecognizer self.navigationController!.view.removeGestureRecognizer(navigationController!.interactivePopGestureRecognizer!) } } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if let gesture = self.popGesture { self.navigationController!.view.addGestureRecognizer(gesture) } }