Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AVFoundation摄像机在返回视图控制器Swift 4时崩溃_Swift_Avfoundation_Swift4_Viewcontroller - Fatal编程技术网

AVFoundation摄像机在返回视图控制器Swift 4时崩溃

AVFoundation摄像机在返回视图控制器Swift 4时崩溃,swift,avfoundation,swift4,viewcontroller,Swift,Avfoundation,Swift4,Viewcontroller,我正在创建一个应用程序,用户可以使用它来录制视频。我有一个登录视图控制器,它指向一个视图控制器(用户可以在此处查看其配置文件详细信息),该控制器指向一个数据采集视图控制器(这是摄像机的显示位置)。一切正常,但当我单击“上一步”按钮返回视图控制器,然后单击“开始数据采集”第二次返回摄像机时,应用程序崩溃 事故信息: 2018-08-11 11:39:51.861569+0100 Liopadata捕获iOS[6343:1642808]* 由于未捕获异常而终止应用程序 “NSInvalidArgum

我正在创建一个应用程序,用户可以使用它来录制视频。我有一个登录视图控制器,它指向一个视图控制器(用户可以在此处查看其配置文件详细信息),该控制器指向一个数据采集视图控制器(这是摄像机的显示位置)。一切正常,但当我单击“上一步”按钮返回视图控制器,然后单击“开始数据采集”第二次返回摄像机时,应用程序崩溃

事故信息:

2018-08-11 11:39:51.861569+0100 Liopadata捕获iOS[6343:1642808]* 由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因:“*-[AVCaptureMetadataOutput setMetadataObjectTypes:]找到不支持的类型-使用 -availableMetadataObjectTypes' ***第一次抛出调用堆栈:(0x1842e6d8c 0x1834a05ec 0x189e54b44 0x10128f4fc 0x1012989a4 0x101298ca4 0x18df01e64 0x18df01a50 0x18eaa4fd8 0x18e12b398 0x18e12a25c 0x18E3A33A00x18E0E13E4 0x18e1297bc 0x18e129654 0x18e3a6350 0x18e734d24 0x18e881af4 0x18e8819a0 0x18e39a49c 0x101297f5c 0x18e05564c 0x18e176870 0x18e05b700 0x18e1911a8 0x18e0d89e0 0x18e0cd890 0x18e0cc1d0 0x18e8add1c 0x18e8b02c8 0x18e8a9368 0x18428f404 0x18428ec2c 0x18428c79c 0x1841acda8 0x186192020 0x18e1cc758 0x101284a90 0x183c3dfc0)libc++abi.dylib:以的未捕获异常终止 类型NSException(lldb)

我正在使用AvCaptureMataOutput检测人脸。此代码位于正在设置摄像机的SessionHandler类中

// define metadata
        let metaOutput = AVCaptureMetadataOutput()

        if cameraSession.canAddOutput(metaOutput) {
            metaOutput.setMetadataObjectsDelegate(self, queue: faceQueue)
            cameraSession.addOutput(metaOutput)
            print("metaoutput added")
        }

        // set metadata to look for faces
        metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.face]
在我的DataCaptureViewController.swift文件中,这是我加载摄像机的地方-

 override func viewDidLoad() {
    super.viewDidLoad()

    sessionHandler.setupCamera()
    audioRecorder.setUpAudioSession()

    createObservers()

    let layer = sessionHandler.layer
    layer.frame = previewView.bounds
    previewView.layer.addSublayer(layer)
    view.layoutIfNeeded()

    jsonSentence.text = "Press start button to get phrase"
    startButton.setTitle("Start", for: .normal)

}
我已经尝试过viewDidAppear和viewWillAppear,但我对swift是新手,我不认为我完全理解他们的所作所为,或者这是否是问题的原因

SessionHandler类变量需要与Objective-C类共享,因此我创建了一个共享实例,用于整个应用程序

static let sharedSession = SessionHandler()

很难知道哪些代码对共享有用,但如果您需要更多信息,我很乐意提供。

最后答案似乎很简单,很抱歉问了这么大的问题

这是因为重新加载DataCaptureViewController时metadataObjectTypes为空。因此,我创建了一个ViewDidAspect方法,并在其中将metadataObjectTypes设置为face

override func viewDidLoad() {
    super.viewDidLoad()
    sessionHandler.setupCamera()
    audioRecorder.setUpAudioSession()

    createObservers()

    let layer = sessionHandler.layer
    layer.frame = previewView.bounds
    previewView.layer.addSublayer(layer)
    view.layoutIfNeeded()

    jsonSentence.text = "Press start button to get phrase"
    startButton.setTitle("Start", for: .normal)


}

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

    sessionHandler.metaOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.face]
}
该应用程序似乎正在运行。如果我做得不正确,尽管请随时更正