在展开可选值时意外发现 nil。 avcapturedeviceinput
unexpectedly found nil while unwrapping an optional value. avcapturedeviceinput
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) {
}
我正在使用 swift 代码编写一个简单的相机应用程序。我尝试了两种不同的方法,但两种方法都出现了相同的错误。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value.
这里
let input = try AVCaptureDeviceInput(device: captureDevice!)
我该如何解决?
你运行在模拟器里吗?因为它不会工作。它将在真实设备中工作。还可以使用 if let 语句安全地打开 captureDevice。这不会使应用程序崩溃。
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")
}
}
这里Optional Binding会帮助你,如果肯定不是nil,它会包装这个值,然后用确认的包装值继续程序流程。以下是 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
}
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) {
}
我正在使用 swift 代码编写一个简单的相机应用程序。我尝试了两种不同的方法,但两种方法都出现了相同的错误。
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value.
这里
let input = try AVCaptureDeviceInput(device: captureDevice!)
我该如何解决?
你运行在模拟器里吗?因为它不会工作。它将在真实设备中工作。还可以使用 if let 语句安全地打开 captureDevice。这不会使应用程序崩溃。
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")
}
}
这里Optional Binding会帮助你,如果肯定不是nil,它会包装这个值,然后用确认的包装值继续程序流程。以下是 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
}