ios - 由于 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 个之前,情节提要中的下一个按钮已连接到另一个视图(动作连接到下一个视图)。
我非常感谢帮助!
解决方案
推荐阅读
- vue.js - 将 Agora.io 与 nuxt.js 集成时出错 创建钩子时出错:“ReferenceError: AgoraRTC is not defined”
- javascript - 如何以 3 个不同的百分比为剑道甘特图任务的背景着色
- php - PHP中的严格类型会影响变量吗?
- apache-spark - 从没有链接的 .yml 创建 conda 环境
- php - 在 foreach 循环中取消设置特定节点
- python - 尝试使用此代码从 MySQL 表中获取多条记录,但树视图中仅显示最后一条记录
- c# - 从 4.5.2 升级到 4.7.2 会破坏 System.Reactive 的使用
- sql - 将 SQL Server 数据库从新版本移动到旧版本
- php - 为什么这段代码没有找到 Key STATUS (PHP)?
- oracle - 在 Oracle 数据库中使用 jpa 和 hibernate 在 spring 中避免对子对象的唯一性约束