У меня есть обычный UIViewController
, который использует AVCapturePhoto
, в котором я создаю собственный контроллер захвата.
Все работало правильно, пока я не обновился до 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 код 1 (используйте -v, чтобы увидеть вызов)
И в трее ошибок показывается это сообщение:
Группа ошибок Apple Mach-O Linker
Любая подсказка, что может быть причиной этого?
Обновленная информация
Вот экран печати Xcode 9 журнала ошибок. Надеюсь, это поможет в решении ошибки компиляции.
Изменить
Просто выполняю некоторые тесты - если я прокомментирую код класса, ошибка компиляции исчезнет.
Есть ли что-то неправильное в следующей реализации 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)
}
}
protocol witness table for __ObjC.AVCapturePhotoSettings : AVFoundation._AVCapturePhotoSettingsSwiftNativeTypes in AVFoundation
- person Lily Ballard   schedule 14.09.2017_
(символа подчеркивания) ранее к некоторым классам AVFoundation, которые Apple случайно сделала закрытыми. Например, изменитеsettings.availablePreviewPhotoPixelFormatTypes.first else
наsettings.__availablePreviewPhotoPixelFormatTypes.first else
. Источник: forums.developer.apple.com/thread/86810#259270 - person r_19   schedule 26.09.2017