Ошибка делегата PHPicker: PHPickerViewControllerDelegate не отвечает на сборщик:didFinishPicking

В WWDC20 Apple представила PHPicker, замену UIImagePickerController.

У меня есть оболочка класса NSObject, которая обрабатывает всю конфигурацию и представление контроллера выбора изображений, теперь я заменяю реализацию для поддержки iOS14.

Даже если я поставлю делегата self Я получаю сообщение об ошибке:

[Picker] PHPickerViewControllerDelegate doesn't respond to picker:didFinishPicking:

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

Вот мой пример кода:

import Foundation
import PhotosUI

class myPicker: PHPickerViewControllerDelegate{
    
    func openFrom(parent:UIViewController!) {
        var config:PHPickerConfiguration! = PHPickerConfiguration()
        config.selectionLimit = 1
        config.filter = nil
        
        let pickerViewController:PHPickerViewController! = PHPickerViewController(configuration:config)
        pickerViewController.delegate = self //<---
        parent.present(pickerViewController, animated:true, completion:nil)
        
    }
    
    func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
        
        picker.dismiss(animated: true, completion:nil)
        
        for result:PHPickerResult in results {
            let itemProvider:NSItemProvider = result.itemProvider
            print(itemProvider)
        }

// ...do something with images...
    }
}

Используй это...

 override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let mypicker = myPicker()
        mypicker.openFrom(parent: self)
    }

Что ты посоветуешь?

1 ответ

Проблема в том, что Cocoa Objective-C не может проанализировать ваш класс. + Изменить

class myPicker: PHPickerViewControllerDelegate

Чтобы

class myPicker: NSObject, PHPickerViewControllerDelegate

Вам нужно сделать "class myPicker" как одноэлементный класс. Потому что вы должны убедиться, что делегат не равен нулю. Кроме того, вы можете изменить этот instance = nil в методе didFinishPicking.

Другие вопросы по тегам