滑动到弹出viewController时如何识别interactivePopGestureRecognizer是否成功继续?

时间:2017-07-26 08:42:03

标签: ios objective-c iphone swift uigesturerecognizer

我想在用户滑动页面以弹出viewController时清理一些属性,只需使其与点击后退按钮一样工作。

我尝试以下代码,但它失败了,因为每次刷卡都不成功。弹出的一些滑动可能会失败,因为手势被取消了。

我在UIGestureRecognizer中找不到足够好的委托(找到像touchesEnded这样的东西)。我也不能使用目标操作,因为操作将被调用太多次。

func viewWillAppear(_ animated: Bool) {
    self.navigationController.interactivePopGestureRecognizer.delegate = self
}
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
   viewModel.goBackPage(isSwipeBack: true)
   return true
}

如何在滑动时解决触发器backButtonPressed以适时弹出viewController?

2 个答案:

答案 0 :(得分:0)

天啊,在@Sam_M(https://stackoverflow.com/users/6739471/sam-m)的评论的帮助下,我解决了它!

override func viewWillDisappear(_ animated: Bool) {
   super.viewWillDisappear(animated)
   if isSwipePop {
      viewModel.goBackPage(withPopViewController: true)
   }
}


func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    switch gestureRecognizer.state {
    case .possible, .began, .changed:
        isSwipePop = true
    default:
        isSwipePop = false
    }
    return true
}

答案 1 :(得分:0)

我发现即使刷卡不成功,也会调用viewWillDisappear。所以我把它改成了这个:

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    print("viewDidDisappear \(self)")
    if isSwipePop && isMovingFromParentViewController {
        viewModel.goBackPage(withPopViewController: true)
    }

    isSwipePop = false
}

有关详细信息,请参阅从第2页到第1页的刷卡方案。

从第二页开始向第一页滑动,在中途向第一页一起放行,然后它反弹回到第二页:

viewWillDisappear第二页 viewWillAppear Page One
viewWillDisappear Page One
viewDidDisappear Page One
viewWillAppear第二页 viewDidAppear第二页

成功从第二页滑到第一页:

viewWillDisappear第二页 viewWillAppear Page One
viewDidDisappear第二页 viewDidAppear Page One