UIImagePickerController делегат не вызывается - PullRequest
0 голосов
/ 24 сентября 2018

Используя приведенный ниже код, он открывает камеру, но не может вызвать метод делегата средства выбора.Я не получаю сообщений об ошибках.

import Foundation
import UIKit
import MobileCoreServices

class RecVidController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        RecVidController.startRecord(delegate: self, sourceType: .camera)
    }

    static func startRecord(delegate: UIViewController & UINavigationControllerDelegate & UIImagePickerControllerDelegate, sourceType: UIImagePickerController.SourceType) {
        guard UIImagePickerController.isSourceTypeAvailable(sourceType) else { return }

        let mediaUI = UIImagePickerController()
        mediaUI.sourceType = sourceType
        mediaUI.mediaTypes = [kUTTypeMovie as String]
        mediaUI.allowsEditing = true
        mediaUI.delegate = delegate
        delegate.present(mediaUI, animated: true, completion: nil)
    }

    @objc func video(_ videoPath: String, didFinishSavingWithError error: Error?, contextInfo info: AnyObject) {
        let title = (error == nil) ? "Success" : "Error"
        let message = (error == nil) ? "Video was saved" : "Video failed to save"

        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.cancel, handler: nil))
        present(alert, animated: true, completion: nil)
    }

}

// MARK: - UIImagePickerControllerDelegate

extension RecVidController: UIImagePickerControllerDelegate {
    private func imagePickerController(_ picker: UIImagePickerController,
                                       didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

        dismiss(animated: true, completion: nil)

        guard let mediaType = info[UIImagePickerController.InfoKey.mediaType] as? String,
            mediaType == (kUTTypeMovie as String),
            let url = info[UIImagePickerController.InfoKey.mediaURL] as? URL,
            UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(url.path)
            else { return }

        // Handle a movie capture
        UISaveVideoAtPathToSavedPhotosAlbum(url.path, self, #selector(video(_:didFinishSavingWithError:contextInfo:)), nil)
    }

}

// MARK: - UINavigationControllerDelegate

extension RecVidController: UINavigationControllerDelegate {
}

Ответы [ 2 ]

0 голосов
/ 15 января 2019

У меня была похожая проблема, когда методы делегата не вызывались программой.

imagePicker.delegate = self должно быть НЕ в методе viewDidLoad (), но в методе, который открывает галерею.Как это:

func openGallery()
    {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self

        imagePicker.sourceType = .photoLibrary

        self.present(imagePicker, animated: true, completion: nil)
   }
0 голосов
/ 24 сентября 2018

Проблема заключается в следующем объявлении:

private func imagePickerController(
    _ picker: UIImagePickerController,
    didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {

Вы объявили этот метод private, поэтому Objective-C не может знать, что он существует.Таким образом, он не может вызвать его.

По сути, Какао проверяет, реализован ли этот метод, обнаруживает, что он не (потому что вы его скрыли), исдается.Там нет видимых штрафов, потому что этот метод делегата является необязательным, и когда он не реализован, Какао отклоняет сборщик для вас, когда пользователь закончил с ним.

Так что просто удалите private, и вы должны быть хорошимиидти.Это подвергает метод делегата Objective-C, и поэтому он будет вызван.

(Вы не должны говорить @objc, чтобы выставить его Objective-C, как если бы это быловаша собственная функция, потому что вы объявили, что мы принимаем UIImagePickerControllerDelegate, который является протоколом Objective-C.)

...