我已经在iOS中使用(AVFoundation)AVCapture Session实现了QR阅读器。在我的 ParentViewController 中,我实现了 CollectionView 。在收集视图单元格中,我已经实现了 QR Code Reader ,并且我开始在单元格中运行捕获会话。它工作正常并读取元数据输出。当元数据输出委托调用时,我停止了会话。但是,如果我离开ParentView Controller,则捕获会话仍在运行,当我导航到另一个ViewController时,它将从后台捕获该会话。为什么会这样,以及在导航到另一个视图控制器时如何停止捕获会话。
这是层次结构,
ParentViewController --->(inside)CollectionView --->(inside) CollectionViewCell --->(inside) QR Reader with capture session Strat.
发生了什么
ParentViewController ----> (navigate to another controller) Capture Session Still Activated and reads qr codes from background
我想要的
ParentViewController ---->(navigate to another controller) Shouldn't capture anything.
我尝试在ParentWideViewController内部的viewWillDisappear
override open func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
let qrreaderCell = QRReaderCell()
qrreaderCell.captureSession.stopRunning()
ColletionView.reloadItems(at: [IndexPath(row: 0, section: 0)])
}
,但没有成功,并失败了。有人可以帮忙吗?
答案 0 :(得分:2)
您正在创建QRReaderCell
的新实例。
let qrreaderCell = QRReaderCell()
qrreaderCell.captureSession.stopRunning()
代替创建新实例,只需访问包含QRReader的当前单元格即可。
let qrreaderCell = collectionView.cellForItem(at: IndexPath(row: 0, section: 0))
qrreaderCell.captureSession.stopRunning()
并确保您的viewWillDisappear
被呼叫。如果没有,则可以在导航到另一个viewController之前立即停止捕获会话。
只需在将您推送或选择到另一个viewController之前停止捕获会话即可。
答案 1 :(得分:0)
似乎有一个保留周期,但是很难在没有看到您的单元配置代码的情况下知道。
要停止现有会话,您应该迭代收集视图并在任何现有单元格上停止会话。您可以在viewDidDisappear中执行此操作(您的方法创建了一个新单元格,无论如何该方法都会在方法结束时释放)
如果发布单元类和控制器类代码,则可能会有所帮助。