Swift Если в настройках указан словарь формата, отличного от нулевого, ваш делегат должен ответить на вывод селектора:didFinishProcessingPhoto

#swift #xcode #avfoundation #avcapturesession #ibaction

Вопрос:

Код, который я использую ниже, должен сделать фотографию, а затем преобразовать изображение в base64, чтобы отправить его на сервер. Код работал, делая фотографию, конвертируя ее в base64 и загружая на мой сервер, но перестал работать. Я пытался использовать другие сообщения о переполнении стека для решения этой проблемы, но это не сработало для меня. Заранее спасибо за любые ответы!

Ошибка

Тема 1: Исключение: «*** -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:] Если вы указываете nil в настройках словарь без формата, ваш делегат должен ответить на селектор captureOutput:didFinishProcessingPhoto:error: или устаревший captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error: «

Код:

 @IBAction func takePhotoButtonPressed(_ sender: Any) {
      let settings = AVCapturePhotoSettings()
      let previewPixelType = settings.availablePreviewPhotoPixelFormatTypes.first!
      let previewFormat = [kCVPixelBufferPixelFormatTypeKey as String: previewPixelType,
                           kCVPixelBufferWidthKey as String: 160,
                           kCVPixelBufferHeightKey as String: 160]
      settings.previewPhotoFormat = previewFormat
      sessionOutput.capturePhoto(with: settings, delegate: self)
}
        

func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
    let imageData = photo.fileDataRepresentation()
    let base64String = imageData?.base64EncodedString()
    print(base64String!)
}
 

Комментарии:

1. Вы понимаете сообщение об ошибке?

2. Я этого не понимаю

Ответ №1:

Давайте разберем сообщение об ошибке:

  • Поток 1: Исключение:

    Исключение Objective C было вызвано из потока 1 вашей программы (вероятно, это основной поток). Не особенно интересно/проницательно.

  • -[AVCapturePhotoOutput capturePhotoWithSettings:delegate:]

    Этот синтаксис описывает метод Objective-C, который вызвал исключение. Селектор метода есть capturePhotoWithSettings:delegate: , и он принадлежит AVCapturePhotoOutput классу. - Указывает, что это метод экземпляра (где a указывало бы, что это метод класса).

  • Если вы укажете словарь ненулевого формата в своих настройках …`

    В этом случае вы позвонили capturePhoto(with: settings, ... с настройками, которых нет nil .

  • ваш делегат должен ответить на селектор captureOutput:didFinishProcessingPhoto:error:

    Система жалуется, что вы передали делегат, который не отвечает на селектор captureOutput:didFinishProcessingPhoto:error: (в Swift метод импортируется как photoOutput(_:didFinishProcessingPhoto:error:) ).

    То есть ваш делегат не определяет никаких методов с таким именем. Вы решили передать self (что бы это ни было, я не знаю без контекста) в качестве делегата: capturePhoto(..., delegate: self) .

    Каким бы ни был тип self , он уже соответствует AVCapturePhotoCaptureDelegate протоколу (иначе он никогда бы не был скомпилирован). Но он не реализует этот метод, который является необязательным по протоколу, но обязательным в данном контексте.

  • или устаревшие captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error:

    Это просто говорит вам о том , что вместо этого captureOutput:didFinishProcessingPhoto:error: вы могли бы решить эту проблему , реализовав captureOutput:didFinishProcessingPhotoSampleBuffer:previewPhotoSampleBuffer:resolvedSettings:bracketSettings:error: , но поскольку это устарело, вам, вероятно, не следует его использовать.

Таким образом, в целом, независимо от типа self , вам нужно убедиться, что он реализует метод photoOutput(_:didFinishProcessingPhoto:error:)