首页 > 解决方案 > 由于 Swift 中的 AddSubview,呈现新视图会导致崩溃

问题描述

我正在开发一个带有自定义相机 UI 的录像机应用程序(我不想使用本机相机 UI),并且我的代码一直出错。更清楚地说,我使用 Storyboard 进行设计(我有一个用于实时预览的 UIView、一个开始录制的按钮和一个用于用户完成录制时的“下一步”按钮(他们需要能够暂停录制,这就是为什么它不会自动转到下一个视图以及为什么有一个下一个按钮)。

这是我在 Stackoverflow 上从这个问题中找到的一个简单但非常好的工作代码:How to Add Live Camera Preview to UIView

    import UIKit
    import AVFoundation
    class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    //Camera Capture requiered properties
    var imagePickers:UIImagePickerController?

    @IBOutlet weak var customCameraView: UIView!

    override func viewDidLoad() {
        addCameraInView()
        super.viewDidLoad()
    }

    func addCameraInView(){

imagePickers = UIImagePickerController()
if UIImagePickerController.isCameraDeviceAvailable( UIImagePickerController.CameraDevice.rear) {
    imagePickers?.delegate = self
    imagePickers?.sourceType = UIImagePickerController.SourceType.camera

    //add as a childviewcontroller
    addChild(imagePickers!)

    // Add the child's View as a subview
    self.customCameraView.addSubview((imagePickers?.view)!)
    imagePickers?.view.frame = customCameraView.bounds
    imagePickers?.allowsEditing = false
    imagePickers?.showsCameraControls = false
    imagePickers?.view.autoresizingMask = [.flexibleWidth,  .flexibleHeight]
    }
}

@IBAction func cameraButtonPressed(_ sender: Any) {

     if UIImagePickerController.isSourceTypeAvailable(.camera){
        imagePickers?.takePicture()

     } else{

      //Camera not available.
    }
}
    }
    @IBAction func nextButtonPressed(_ sender: Any) {
    print("Button tapped")
    }

这非常有效,但是当我单击下一个按钮( nextButtonPressed() )时,应用程序在这行代码上崩溃:

    self.customCameraView.addSubview((imagePickers?.view)!)

我得到的错误是“线程 1:致命错误:在隐式展开可选值时意外发现 nil”。

我认为 Subview 给了我这个错误,我已经尝试了很多方法来解决这个错误,但我还没有找到解决方案。这是我在 nextButtonPressed() 中尝试过的(注意:我分别尝试了它们,而不是一起尝试,除了尝试 6)。

    1
    self.customCameraView.remove((imagePickers?.view)!)

    2
    self.customCameraView.removeFromSuperview()

    3
    _ = customCameraView.layer.sublayers?.filter{ $0 is CAShapeLayer }.map{ $0.removeFromSuperlayer() }

    4 
    self.customCameraView.layer.sublayers?.popLast()

    5
    self.customCameraView.sendSubviewToBack((imagePickers?.view)!)

    6
    //self.customCameraView.sendSubviewToBack((imagePickers?.view)!)
    //        let storyboard = UIStoryboard (name: "Main", bundle: nil)
    //        let nextView = storyboard.instantiateViewController (withIdentifier: "VideoIsRecordedController")
    //        let navi = UINavigationController (rootViewController: nextView)
    //        present (navi, animated: true, completion: nil)

在尝试第 6 个之前,情节提要中的下一个按钮已连接到另一个视图(动作连接到下一个视图)。

我非常感谢帮助!

标签: iosswiftuikitavfoundationvideo-recording

解决方案


推荐阅读