ios - 如何让相机功能仅显示在一个标签栏项目中?

标签 ios swift

我目前正在 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/

相关文章:

iphone - 使用 Pinterest 登录

ios - 将上一帧结果作为输入传递给下一帧

ios - shouldChangeCharactersIn 方法的正确行为,UITextFieldDelegate 的委托(delegate)

ios - 当我在 iPad 上运行时,我的游戏一直崩溃并提示 "EXC_BAD_ACCESS(code=1, address=0xb176e978) "

swift - 如何在 60 秒内制作适合图形形状的动画?

ios - NSZombie 的替代品

ios - 获取 native 应用程序 objective-c 中当前播放的非音乐应用程序轨道的信息

ios - iOS 8 上的 MPVolumeView 动画

json - 在 Swift 3.1 中使用 SwiftyJSON 作为子数组

ios - Realm swift 中的一对一关系