如何识别interactivePopGestureRecognizer成功进行刷卡时弹出viewController?

问题描述:

我想清理一些属性时,用户滑动页面弹出viewController,只是使其工作原理与点击返回按钮相同。如何识别interactivePopGestureRecognizer成功进行刷卡时弹出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在正确的时刻?

+1

你为什么不使用'viewDidDisappear'? –

+0

因为推到下一个viewController也会触发viewDidDisappear。 但你给了我一个想法,也许我可以使用gestureRecognizer的状态来设置一个标志'isSwipeBegan'来决定我是否在viewDidDisappear中滑回。 – allenlinli

哦,我的上帝,在@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: 
     isSwipePop = true 
     break 
    case .began: 
     isSwipePop = true 
     break 
    case .changed: 
     isSwipePop = true 
     break 
    default: 
     isSwipePop = false 
     break 
    } 
    return true 
} 
+1

很高兴帮助:)您也可以使用'if self.isBeingDismissed || self.isMovingFromParentViewController {0}确定您是前进还是后退。 –

+0

你也可以结合你的例子,例如'case.possible,.began,.changed:',你也不需要在快速切换中使用'break'。每种情况都会自动中断交换机。 –

+0

嗨@Sam_M,我更新了一个答案beloew,也许你感兴趣:) – allenlinli

我发现viewWillDisappear即使刷卡不成功也会被调用。所以我改成了这样:

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

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

    isSwipePop = false 
} 

欲了解更多信息,这是从两个页面滑动到一个页面的场景。

刷卡到一个页面从两个页面,发布在半路上刷卡一页,它弹回两页:

viewWillDisappear第二页
viewWillAppear中第一个
viewWillDisappear壹
viewDidDisappear壹
viewWillAppear中第二页
viewDidAppear第二页

从成功两页的滑动即可一页:

viewWillDisappear第二页
viewWillAppear中第一个
viewDidDisappear第二页
viewDidAppear壹