当我返回菜单时,应用程序崩溃(线程 1:SIGABRT 信号)
When I go back to menu, the App crashes (Thread 1: signal SIGABRT)
我的应用程序即将完成 "AR Note"。
我只需要修复一个错误。
我有一个主菜单,其中有 7 个按钮链接到视图控制器。要返回主菜单,我使用
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
在我的旧版本中,这工作得很好。我所改变的是,我的主菜单的背景是一个模糊的相机视图,效果很好。现在,有了这个模糊的相机视图背景,应用程序总是因线程 1 崩溃:发出 SIGABRT 信号!这在我看来很尴尬,因为它说没有错误,并且没有模糊的相机视图背景,后退按钮工作正常。
这是我的主菜单代码:
import UIKit
import AVFoundation
class ViewControllerBlurrHome: UIViewController {
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
let session: AVCaptureSession = AVCaptureSession()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
session.sessionPreset = AVCaptureSession.Preset.high
if let device = AVCaptureDevice.default(for: AVMediaType.video) {
do {
try session.addInput(AVCaptureDeviceInput(device: device))
} catch {
print(error.localizedDescription)
}
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
self.view.layer.insertSublayer(previewLayer,at:0)
previewLayer.frame = self.view.layer.bounds
}
session.startRunning()
let blur = UIBlurEffect(style: .regular)
let blurView = UIVisualEffectView(effect: blur)
blurView.frame = self.view.bounds
blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.view.insertSubview(blurView,at:1)
}
// ShareButton
@IBAction func sharePressed(_ sender: Any) {
let activityVC = UIActivityViewController(activityItems: ["enter App Link here"], applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)
}
}
这是我的主菜单的样子:
这是我的 main.storyboard 的样子:
我是这样使用后退按钮的:
这是一个替代方案 viewcontroller.swift
,没有模糊的东西,效果非常好:
import UIKit
class ViewControllerBasis: UIViewController {
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func sharePressed(_ sender: Any) {
let activityVC = UIActivityViewController(activityItems: ["enter App Link here"], applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)
}
你是这个意思吗?
image4
有这个:
image5
还有这个:
image6
很可能发生这种情况是因为您将 AV 代码放入 viewWillAppear
。每次您进入视图时都会执行此方法(在您的情况下是应用程序启动时以及用户返回主菜单时)。
这一行绝对不是要执行多次的:
try session.addInput(AVCaptureDeviceInput(device: device))
还有这个:
session.startRunning()
还有这个:
self.view.insertSubview(blurView,at:1)
一个快速的解决方法是将所有这些逻辑放在一个专用函数中,并只向 运行 添加一个标志一次。类似的东西:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addBlur()
}
var didAddBlur = false
func addBlur() {
if didAddBlur {
return
}
didAddBlur = true
//Your code
}
我的应用程序即将完成 "AR Note"。 我只需要修复一个错误。
我有一个主菜单,其中有 7 个按钮链接到视图控制器。要返回主菜单,我使用
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
在我的旧版本中,这工作得很好。我所改变的是,我的主菜单的背景是一个模糊的相机视图,效果很好。现在,有了这个模糊的相机视图背景,应用程序总是因线程 1 崩溃:发出 SIGABRT 信号!这在我看来很尴尬,因为它说没有错误,并且没有模糊的相机视图背景,后退按钮工作正常。
这是我的主菜单代码:
import UIKit
import AVFoundation
class ViewControllerBlurrHome: UIViewController {
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
let session: AVCaptureSession = AVCaptureSession()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
session.sessionPreset = AVCaptureSession.Preset.high
if let device = AVCaptureDevice.default(for: AVMediaType.video) {
do {
try session.addInput(AVCaptureDeviceInput(device: device))
} catch {
print(error.localizedDescription)
}
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
self.view.layer.insertSublayer(previewLayer,at:0)
previewLayer.frame = self.view.layer.bounds
}
session.startRunning()
let blur = UIBlurEffect(style: .regular)
let blurView = UIVisualEffectView(effect: blur)
blurView.frame = self.view.bounds
blurView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.view.insertSubview(blurView,at:1)
}
// ShareButton
@IBAction func sharePressed(_ sender: Any) {
let activityVC = UIActivityViewController(activityItems: ["enter App Link here"], applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)
}
}
这是我的主菜单的样子:
这是我的 main.storyboard 的样子:
我是这样使用后退按钮的:
这是一个替代方案 viewcontroller.swift
,没有模糊的东西,效果非常好:
import UIKit
class ViewControllerBasis: UIViewController {
@IBAction func unwindFromSources(segue: UIStoryboardSegue){
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func sharePressed(_ sender: Any) {
let activityVC = UIActivityViewController(activityItems: ["enter App Link here"], applicationActivities: nil)
activityVC.popoverPresentationController?.sourceView = self.view
self.present(activityVC, animated: true, completion: nil)
}
你是这个意思吗?
image4
有这个:
image5
还有这个:
image6
很可能发生这种情况是因为您将 AV 代码放入 viewWillAppear
。每次您进入视图时都会执行此方法(在您的情况下是应用程序启动时以及用户返回主菜单时)。
这一行绝对不是要执行多次的:
try session.addInput(AVCaptureDeviceInput(device: device))
还有这个:
session.startRunning()
还有这个:
self.view.insertSubview(blurView,at:1)
一个快速的解决方法是将所有这些逻辑放在一个专用函数中,并只向 运行 添加一个标志一次。类似的东西:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addBlur()
}
var didAddBlur = false
func addBlur() {
if didAddBlur {
return
}
didAddBlur = true
//Your code
}