当我尝试从情节提要中转接时,为啥在这行代码中出现段错误?

Posted

技术标签:

【中文标题】当我尝试从情节提要中转接时,为啥在这行代码中出现段错误?【英文标题】:Why am I getting a seg fault in this line of code when I try to segue from storyboard?当我尝试从情节提要中转接时,为什么在这行代码中出现段错误? 【发布时间】:2017-07-08 19:19:01 【问题描述】:

所以,我试图将情节提要中的一个按钮与另一个 ViewController 连接起来。但是,每次我点击按钮时,应用程序都会崩溃。这是应用崩溃时突出显示的代码行。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

    let barcodeViewController: BarcodeReaderViewController = segue.destination as! BarcodeReaderViewController
    barcodeViewController.delegate = self


这是我的 BarCodeVC

import UIKit
import AVFoundation

protocol BarcodeDelegate 
  func barcodeReaded(barcode: String)


class BarcodeViewController: UIViewController, 
                             AVCaptureMetadataOutputObjectsDelegate 

var delegate: BarcodeDelegate?

var videoCaptureDevice: AVCaptureDevice = 
 AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo)
var device = AVCaptureDevice.defaultDevice(withMediaType: 
  AVMediaTypeVideo)
var output = AVCaptureMetadataOutput()
var previewLayer: AVCaptureVideoPreviewLayer?

var captureSession = AVCaptureSession()
var code: String?

override func viewDidLoad() 
  super.viewDidLoad()

  self.view.backgroundColor = UIColor.clear
  self.setupCamera()


private func setupCamera() 

  let input = try? AVCaptureDeviceInput(device: videoCaptureDevice)

  if self.captureSession.canAddInput(input) 
      self.captureSession.addInput(input)
  

  self.previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)

  if let videoPreviewLayer = self.previewLayer 
      videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
      videoPreviewLayer.frame = self.view.bounds
      view.layer.addSublayer(videoPreviewLayer)
  

  let metadataOutput = AVCaptureMetadataOutput()
  if self.captureSession.canAddOutput(metadataOutput) 
      self.captureSession.addOutput(metadataOutput)

      metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
      metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code]
   else 
      print("Could not add metadata output")
  


 override func viewWillAppear(_ animated: Bool) 
   super.viewWillAppear(animated)

   if (captureSession.isRunning == false) 
      captureSession.startRunning();
   


override func viewWillDisappear(_ animated: Bool) 
  super.viewWillDisappear(animated)

  if (captureSession.isRunning == true) 
     captureSession.stopRunning();
  


func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [Any]!, from connection: AVCaptureConnection!) 
   // This is the delegate'smethod that is called when a code is readed
   for metadata in metadataObjects 
       let readableObject = metadata as! AVMetadataMachineReadableCodeObject
       let code = readableObject.stringValue


       self.dismiss(animated: true, completion: nil)
       self.delegate?.barcodeReaded(barcode: code!)
       print(code!)
   
 

我的 segue 只是一个简单的拖动来显示,而不是通过编程方式。所以我有点困惑为什么它会崩溃。

这是错误:

无法转换“BarCodeProj.ViewController”类型的值 (0x1000361b0) 到 'BarCodeProj.BarcodeViewController' (0x100035a78)。

【问题讨论】:

控制台是否碰巧显示消息“致命错误:在展开可选值时意外发现 nil”? 不,它会在控制台中打印:无法将“BarCodeProj.ViewController”(0x1000361b0)类型的值转换为“BarCodeProj.BarcodeReaderViewController”(0x100035a78)。 啊。这就是你的答案。 在您的故事板中,您没有正确设置 ViewController 的类。 Can't cast value of type UIViewController to PatternDetailViewController的可能重复 【参考方案1】:

在这种情况下,控制台错误会告诉您您需要知道的一切。 segue.destination 不是 BarcodeReaderViewController,因此您尝试将其转换为一个(使用 as!)会导致灾难性的失败。

首先,检查您的故事板并确保您正确设置了视图控制器的类型(您要过渡到的那个)。

通过在情节提要中选择适当的视图控制器并在此处检查来做到这一点:

【讨论】:

试过这个。确保它在适当的类中。我确实注意到我的 swift 文件名和类名不同,所以我将它们更改为匹配(不确定这有多重要)。对不起,我是初学者,还在学习。我在控制台中遇到相同的崩溃并显示相同的消息。下面是这行代码现在的样子: override func prepare(for segue: UIStoryboardSegue, sender: Any?) let barcodeViewController: BarcodeViewController = segue.destination as! BarcodeViewControllerbarcodeViewController.delegate = self 知道了!在我将其设置为目的地之前,必须检查 segue id。这就是我的逻辑落空的地方。但是您的回答指导我确保我匹配类名和 VC 文件名。谢谢!你太棒了!

以上是关于当我尝试从情节提要中转接时,为啥在这行代码中出现段错误?的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试在 Xcode 6.1 中调整情节提要中其他视图的大小时,为啥某些视图的框架变为 (0,0,0,0)

当我以编程方式从情节提要加载窗口时,为啥在 NSView 中未调用 drawRect?

添加到情节提要的 UIBarButtonItem 在运行时不会出现

当我使用自动布局移动视图时,为啥 XCode 5 没有在情节提要中添加约束

为啥在使用情节提要时反复调用 AwakeFromNib?

我在情节提要中的对象没有与代码正确链接