我目前正在 Xcode 10 中创建 QR 扫描器/阅读器应用程序。我有一个包含两个选项卡栏项的选项卡 Controller 。
1.) 主页
2.) 二维码扫描器
尽管我的代码有效并且我可以在“第二个 View Controller ”中扫描二维码,但每当我切换到“第一个 View Controller ”时,它仍然会在我不希望扫描二维码时扫描二维码。如果您对我如何解决此问题有任何提示,我们将不胜感激。
第一个 View Controller :
import UIKit
class FirstViewController: UIViewController{
override func viewDidLoad() {
super.viewDidLoad()
}
}
第二 View Controller :
import UIKit
import AVFoundation
class SecondViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
var video = AVCaptureVideoPreviewLayer()
@IBOutlet weak var square: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
//Creating session
let session = AVCaptureSession()
//Define Capture device
let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
do {
let input = try AVCaptureDeviceInput(device: captureDevice!)
session.addInput(input)
} catch {
print (">>>>Error")
}
let output = AVCaptureMetadataOutput ()
session.addOutput(output)
output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
video = AVCaptureVideoPreviewLayer(session: session)
video.frame = view.layer.bounds
view.layer.addSublayer(video)
self.view.bringSubviewToFront(square)
session.startRunning()
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
if metadataObjects != nil && metadataObjects.count != 0 {
if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject{
if object.type == AVMetadataObject.ObjectType.qr{
let alert = UIAlertController(title: "QR code", message: object.stringValue, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Retake", style: .default, handler: nil))
present(alert,animated: true, completion: nil)
}
}
}
}
}
最佳答案
我建议将 session 作为成员变量添加到您的类中,而不仅仅是 viewDidLoad() 方法。
现在在您的 viewWillAppear() 方法中,您可以调用 session.startRunning() 并在 viewWillDisappear 中调用 session.stopRunning()
这是一个基本的布局:
class SecondViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
let session = AVCaptureSession()
override func viewDidLoad() {
// any setup you may need
}
override func viewWillAppear() {
// ensure everything is setup correctly
session.startRunning()
}
override func viewWillDisappear() {
// anything before navigating away
session.stopRunning()
}
}
关于ios - 如何让相机功能仅显示在一个标签栏项目中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638551/