неожиданно обнаружил ноль при развертывании необязательного значения. avcapturedeviceinput - PullRequest
0 голосов
/ 17 января 2020
class ViewController: UIViewController {

    @IBOutlet weak var cameraView: UIView!

    var captureSession: AVCaptureSession?
    var videoPreviewLayer: AVCaptureVideoPreviewLayer?
    var frontCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for :.video, position: .front)
    var backCamera = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)


    override func viewDidLoad() {
        super.viewDidLoad()

        if #available(iOS 10.2, *){

            let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
            do{
                let input = try AVCaptureDeviceInput(device: captureDevice!)
                captureSession = AVCaptureSession()
                captureSession?.addInput(input)
                videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
                videoPreviewLayer?.frame = view.layer.bounds
                cameraView.layer.addSublayer(videoPreviewLayer!)
                captureSession?.startRunning()
            }
            catch {
                print("error")
            }
        }
        // Do any additional setup after loading the view.
    }

    @IBAction func ImageCapture(_ sender: Any) {

    }

Я пишу простое приложение для камеры на быстром коде. Я пытался двумя разными способами, но я получаю одинаковую ошибку в обоих.

Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения.

здесь

let input = try AVCaptureDeviceInput(device: captureDevice!)

Как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Вы запускаете его в симуляторе? Потому что это не сработает. Это будет работать в реальном устройстве. Также безопасно разверните ваш captureDevice, используя оператор if let. Это не Cra sh приложение.

if #available(iOS 10.2, *){

    if let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
        do{
            let input = try AVCaptureDeviceInput(device: captureDevice)
            captureSession = AVCaptureSession()
            captureSession?.addInput(input)
            videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
            videoPreviewLayer?.frame = view.layer.bounds
            cameraView.layer.addSublayer(videoPreviewLayer!)
            captureSession?.startRunning()
        }
        catch {
            print("error")
        }
    } else {
        print("camera not available")
    }
}
1 голос
/ 17 января 2020

Здесь Опциональное связывание поможет вам, оно обернет значение, если оно, конечно, не равно нулю, и продолжит выполнение программы с подтвержденным обернутым значением. Ниже приведен пример Optional Binding in Swift

if let captureDevice = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) {
    // do you desired code here, here captureDevice object has a confirmed value 
}else{
    // here captureDevice is nil, can assist the user accordingly
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...