2017-09-14 91 views
3

我有一个正常的UIViewController,使用AVCapturePhoto我创建了一个自定义捕获控制器。更新到Xcode 9后Swift编译AVcode错误/ Swift 4

一切工作正常,直到我更新到Xcode 9并转换我的代码Swift 4,现在当我尝试编译我得到这个编译错误:

Undefined symbols for architecture x86_64: "__T0So22AVCapturePhotoSettingsC12AVFoundation01_abC16SwiftNativeTypesACWP", referenced from: __T05Union16CameraControllerC18handleCapturePhotoyyF in CameraController.o "__T012AVFoundation39_AVCapturePhotoSettingsSwiftNativeTypesPAAE016availablePreviewc11PixelFormatG0Says6UInt32VGfg", referenced from: __T05Union16CameraControllerC18handleCapturePhotoyyF in CameraController.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

,并在错误托盘显示此消息:

Apple Mach-O Linker Error Group

任何提示可能会导致这种情况?

更新的信息

这里的错误日志的Xcode的9打印屏幕。希望它有助于编译错误解决方案。

enter image description here

编辑

只是进行一些测试 - 如果我评论类代码,编译错误消失。

以下class实施中是否有什么错误,我在Swift 4中丢失?

import UIKit 
import AVFoundation 


class CameraController: UIViewController, AVCapturePhotoCaptureDelegate, UIViewControllerTransitioningDelegate { 

    let dismissButton: UIButton = { 
     let button = UIButton(type: .system) 
     button.setImage(#imageLiteral(resourceName: "right_arrow_shadow").withRenderingMode(.alwaysOriginal), for: .normal) 
     button.addTarget(self, action: #selector(handleDismiss), for: .touchUpInside) 
     return button 
    }() 

    let capturePhotoButton: UIButton = { 
     let button = UIButton(type: .system) 
     button.setImage(#imageLiteral(resourceName: "capture_photo").withRenderingMode(.alwaysOriginal), for: .normal) 
     button.addTarget(self, action: #selector(handleCapturePhoto), for: .touchUpInside) 
     return button 
    }() 

    let output = AVCapturePhotoOutput() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     transitioningDelegate = self 
     setupCaptureSession() 
     setupHUD() 
    } 


    // hiddes the status bar 
    override var prefersStatusBarHidden: Bool { return true } 

    //MARK: General funcs 
    fileprivate func setupCaptureSession() { 
     let captureSession = AVCaptureSession() 

     //1. setup inputs - camera 
     let captureDevice = AVCaptureDevice.default(for: AVMediaType.video) 
     do { 
      let input = try AVCaptureDeviceInput(device: captureDevice!) 
      if captureSession.canAddInput(input) { 
       captureSession.addInput(input) 
      } 
     } catch let err { 
      print("Could not setup camera input:", err) 
     } 
     //2. setup outputs 
     if captureSession.canAddOutput(output) { 
      captureSession.addOutput(output) 
     } 
     //3.setup output preview 
     let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)  
     previewLayer.frame = view.frame 
     view.layer.addSublayer(previewLayer) 

     // starts the inputs/outputs 
     captureSession.startRunning() 
    } 


    fileprivate func setupHUD() { 
     // botão de captura 
     view.addSubview(capturePhotoButton) 
     capturePhotoButton.anchor(top: nil, left: nil, bottom: view.bottomAnchor, right: nil, paddingTop: 0, paddinfLeft: 0, paddingBottom: 24, paddingRight: 0, width: 80, height: 80) 
     capturePhotoButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 

     // dismiss button 
     view.addSubview(dismissButton) 
     dismissButton.anchor(top: view.topAnchor, left: nil, bottom: nil, right: view.rightAnchor, paddingTop: 12, paddinfLeft: 0, paddingBottom: 0, paddingRight: 12, width: 50, height: 50) 
    } 


    @objc func handleCapturePhoto() { 
     // processes the captured photo 
     let settings = AVCapturePhotoSettings() 
     guard let preview = settings.availablePreviewPhotoPixelFormatTypes.first else { return } 
     settings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: preview] 
     output.capturePhoto(with: settings, delegate: self) 
    } 


    @objc func handleDismiss() { 
     dismiss(animated: true, completion: nil) 
    } 


    // Camera delegate 
    func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 
     // access the captured image 
     let imageData = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: photoSampleBuffer!, previewPhotoSampleBuffer: previewPhotoSampleBuffer!) 
     let previewImage = UIImage(data: imageData!) 

     // shows the image 
     let containerView = PreviewPhotoContainerView() 
     containerView.previewImageView.image = previewImage 

     view.addSubview(containerView) 
     containerView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddinfLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0) 

    } 
} 
+0

你未定义的符号demangles成'为__ObjC.AVCapturePhotoSettings协议见证表:在AVFoundation' –

+0

AVFoundation._AVCapturePhotoSettingsSwiftNativeTypes @KevinBallard抱歉,但我有点失去了您的评论。 你是说我需要符合AVCapturePhotoSettings协议? –

+1

我很困惑,为什么这是另一个问题的重复。在我的iphone7上测试时出现此错误。把这个标记为重复的人喝醉了!我发现了几种修复我的问题的方法,而不使用该代码,#if arch(x86_64) –

回答

2

所以我设法解决了这个问题。

不知何故,在Xcode 9中,您不能实现“免费”代码,这些代码在iOS模拟器上无法使用。

错误 - 解决后 - 非常简单。

我不能在模拟器中使用相机,因为它不起作用。

我认为Xcode可以提供更多有用的错误信息。

为了解决这个问题,在我的CameraController class我不得不编辑我的handleCapturePhoto()函数。

我必须检查,如果使用的架构不是x86_64(模拟器),那么我可以呈现相机输出。

这是函数解决状态:

@objc func handleCapturePhoto() { 
    // processes the captured photo 
    let settings = AVCapturePhotoSettings() 

    // doesn't show in the simulator 
    #if (!arch(x86_64)) 
     guard let preview = settings.previewPhotoFormat?.first else { return } 
     settings.previewPhotoFormat = [kCVPixelBufferPixelFormatTypeKey as String: preview] 
     output.capturePhoto(with: settings, delegate: self) 
    #endif 
} 

希望这可以帮助别人的未来。

+0

这会让您构建并运行您的项目,但不是解决问题的真正解决方案。我试过这个,并且替换了我找到的其他解决方案,而没有使用'#if(!arch(x86_64))',而且它的行为并不像预期的那样。但是,如果它适合你,它适用于你。请注意,此解决方案可能会解决该问题,但会替换为新问题 –

+0

这非常简单。如果设备是模拟器 - 请勿打开相机。这只是为了测试,在发布版本中,我可以删除#ifdef反正如果我想 –

+0

正如我所提到的,我在我的iPhone 7上试过这个解决方案,并且它删除了编译错误,但它的行为方式与预期。所以,请确保您的所有功能都按预期工作。如果是这样,你很好。 –