我在我的应用程序中遇到了同样的问题,我需要知道视图控制器何时启动和停止被偷看,并提出以下问题。
为了监控偷看的生命周期,您可以跟踪被偷看的视图控制器的生命周期,从创建的视图控制器开始,previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController
到它的viewDidDisappear()
.
我在被窥视的视图控制器中创建了一个回调处理程序PeekingViewController
,
var viewDidDisappearHandler: (()->())? = nil
并将其放在PeekingViewController
'sviewDidDisappear
中:
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
viewDidDisappearHandler?()
}
回到OriginalViewcontroller
我们正在窥视的PeekingViewController
地方,保持对被窥视的视图控制器实例的弱引用,如下所示:
weak var peekingViewController: PeekingViewController?
func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
self.peekingViewController = PeekingViewController()
return peekingViewController
}
然后,您可以通过在实例中填写 didSet 来观察对被窥视的视图控制器的弱引用的变化,peekingViewController
如下所示:
weak private var peekingViewController: PeekingViewController? {
didSet {
peekingViewController?.viewDidDisappearHandler = { [weak self] in
self?.peekingViewController = nil
}
if peekingViewController == nil { // Peek ended
handlePeekEnded()
} else { // Peek began
handlePeekBegan()
}
}
}
注意:如果执行并取消了一个峰值,则会触发此逻辑,但如果执行了一个峰值,则segue完成,然后PeekingViewController
弹出新呈现的。
如果您需要关于取消窥视的逻辑,仅通过不完整的窥视触发,而不是完整的峰值然后解除,您可以通过以下方式实现:
包括一个新的布尔值OriginalViewController
来跟踪视图控制器是否被完全推送(OriginalViewController
'sviewDidDisappear
将在完全推送时触发,但不会在偷看时触发),并检查peekingViewController
's中的布尔值didSet
,以确定是否应采取任何操作,并设置peekingViewController
为零。OriginalViewController
_viewWillAppear