ios - 错误线程 1 : Fatal error: Unexpectedly found nil while unwrapping an Optional value?

标签 ios iphone swift warnings

是的,我知道有人问过这样的问题,但我已经检查了所有我能找到的问题,但仍然无法解决这个问题。也许我遇到的这个问题也会帮助其他人。

我正在尝试制作一个相机应用程序,但是当我运行该应用程序时它立即失败了。我已经标记了它失败的地方并给我以下警告......

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

这是代码,我已经标记了其中收到警告的部分:

    import UIKit
import AVFoundation

class ViewController: UIViewController {

    var captureSession = AVCaptureSession()

    var backCamera: AVCaptureDevice?
    var frontCamera: AVCaptureDevice?
    var currentCamera: AVCaptureDevice?

    var photoOutput: AVCapturePhotoOutput?

    var cameraPreviewlayer: AVCaptureVideoPreviewLayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        setupCaptureSession()
        setupInputOutput()
        setupPreviewLayer()
        startRunningCaptureSession()

        // Do any additional setup after loading the view, typically from a nib.
    }

    func setupCaptureSession() {
        captureSession.sessionPreset = AVCaptureSession.Preset.photo
    }

    func setupDevice() {
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)

        let devices = deviceDiscoverySession.devices

        for device in devices {
            if device.position == AVCaptureDevice.Position.back {
                backCamera = device
            } else if device.position == AVCaptureDevice.Position.front {
                frontCamera = device
            }
        }

        currentCamera = backCamera
    }

    func setupInputOutput() {
        do {
            let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!) //Here is the error-------
            captureSession.addInput(captureDeviceInput)
            photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)

        } catch {
            print(error)
        }
    }

    func setupPreviewLayer(){
        cameraPreviewlayer = AVCaptureVideoPreviewLayer(session: captureSession)
        cameraPreviewlayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewlayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        cameraPreviewlayer?.frame = self.view.frame
        self.view.layer.insertSublayer(cameraPreviewlayer!, at: 0)
    }

    func startRunningCaptureSession() {
        captureSession.startRunning()
    }

    @IBAction func CameraButton_TouchUpInside(_ sender: Any) {

        performSegue(withIdentifier: "showPhoto_Segue", sender: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

最佳答案

您没有在代码中的任何地方调用 setupDevice(),即使调用了,您也始终将 currentCamera 设置为 backCamera,这可能如果设备没有后置摄像头,则为nil

只需将 setupDevice() 调用添加到您的 viewDidLoad() 中:

    override func viewDidLoad() {
        super.viewDidLoad()

        setupCaptureSession()
        setupDevice()
        setupInputOutput()
        setupPreviewLayer()
        startRunningCaptureSession()
    }

关于ios - 错误线程 1 : Fatal error: Unexpectedly found nil while unwrapping an Optional value?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51696914/

相关文章:

ios - swift MVVM : Where to keep custom model data if we have an array of models

iphone - 关于以下内存泄漏的任何建议

iphone - 键盘 'Done'按钮上的Resign键盘

ios - 嵌入到选项卡栏 Controller 偏移 TableView

ios - Swift 4/5 设置向 WKWebview 添加代理

c++ - 如何在内存中保留 C++ 对象?

ios - 在 Swift 中与两个 Collection View 同步滚动?

iphone - Xcode 4.6,用作前一个参数的名称而不是选择器的一部分

ios - UITableView willDisplayCell 方法的不当行为

iphone - 如何在iPhone上获取Wifi的RSSI?