Метод UIDocumentPickerDelegate (didPickDocumentsAt) не вызывается iOS - PullRequest
0 голосов
/ 17 января 2019

У меня есть запрос относительно метода делегата, который не вызывается для DocumentPickerViewController, вот фон, мне просто нужно импортировать ресурс, доступный из моего приложения «Файлы», и по этой причине я использую UIDocumentPickerViewController.

У меня есть отдельный ViewController, к которому я добавляю представление documentPickerViewController как подпредставление и добавляю его делегат. Код моего ViewController выглядит следующим образом.

var documentPickerController: UIDocumentPickerViewController!
  let supportedUTI = [kUTTypeImage,kUTTypeSpreadsheet,kUTTypePresentation,kUTTypeDatabase,kUTTypeFolder,kUTTypeZipArchive,kUTTypeVideo, kUTTypeAudiovisualContent]

documentPickerController = UIDocumentPickerViewController.init(documentTypes: supportedUTI as [String], in: .import)
    documentPickerController.delegate = self
    documentPickerController.allowsMultipleSelection = false
    view.addSubview(documentPickerController.view)

Теперь, когда я вижу, что pickercontroller открыт, и когда я нажимаю на Отмена, вызывается documentPickerWasCancelled, но когда я выбираю файл, documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL] не вызывается.

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

UIDocumentPickerViewController *dc = [[UIDocumentPickerViewController alloc] initWithDocumentTypes:[self UTITypes] inMode:UIDocumentPickerModeImport];
    dc.delegate = self;
    [MainVC presentViewController:dc animated:YES completion:nil];

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

1 Ответ

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

Ответ прост: это унаследовано от UIViewController. Если вы просто добавляете представление viewController к вашему представлению, методы делегата не вызываются. ViewController имеет свой жизненный цикл. Пожалуйста, прочитайте здесь: https://developer.apple.com/documentation/uikit/uidocumentpickerviewcontroller

Итак, извиняюсь за то, что был не прав. Конечно, вы можете добавить sub-viewController, показывающий только его вид. Но: я думаю, что это не должно быть вариантом использования. Это полноэкранный ViewController, соответствующий руководствам по дизайну от самого Apple. При этом, вы должны представить его с:

func addPicker() {
    var documentPickerController: UIDocumentPickerViewController!

    documentPickerController = UIDocumentPickerViewController(documentTypes: [String(kUTTypePDF)], in: .import)
    documentPickerController.delegate = self
    documentPickerController.allowsMultipleSelection = false

    present(documentPickerController, animated: true, completion: nil)
}

Имеются некоторые ошибки, когда разработчик обнаружил, что представление закрывается до вызова делегата. Насколько я видел, это поведение было введено с ios11 и произошло также, когда был представлен viewController. Я не могу сказать, исправлено ли это или нет, и связано ли это поведение с тем, чтобы показать его как подпредставление. (Я думаю, что это как-то исправлено, так как работает с представленным viewController)

В любом случае, вы должны просто представить его, как написано выше, и вы готовы идти.

...