Нет обратного вызова при использовании UIDocumentPickerViewController

Я использую UIDocumentPickerViewController для выбора документа с iPhone.

Я реализовал эту функцию следующим образом.

class Si3EntityDocumentViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIDocumentInteractionControllerDelegate, UIDocumentPickerDelegate, UINavigationControllerDelegate, UIDocumentMenuDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        setLoader()
        getDocuments(id:entity.id)
        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        button.backgroundColor = .red
        button.setTitle("Upload Doc", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        self.view.addSubview(button)
        // Do any additional setup after loading the view.
    }

    @objc func buttonAction(sender: UIButton!){
        let documentPicker = UIDocumentPickerViewController(documentTypes: [String(kUTTypeText),String(kUTTypeContent),String(kUTTypeItem),String(kUTTypeData)], in: .import)
        documentPicker.delegate = self
        present(documentPicker, animated: true, completion: {
            documentPicker.delegate = self
        } )
    }

    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
        print(urls)
    }

}

Метод func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt url: URL) устарел в iOS 11, поэтому я заменил его на func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]).

По какой-то причине я не получаю обратный вызов в func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL])

У меня также есть другой код в этом классе, но я его не включил. Когда я выбираю документ или нажимаю кнопку "Отмена", я получаю следующую ошибку в консоли

[DocumentManager] Служба просмотра завершилась с ошибкой: Error Domain=_UIViewServiceErrorDomain Code=1 "(null)" UserInfo={Terminated=disconnect method}

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

Спасибо в ожидании.


person Vedant Shirke    schedule 20.11.2018    source источник


Ответы (3)


Вы можете ознакомиться с документацией Apple для лучшего понимания.

По умолчанию UIDocumentPickerViewController выбирает один документ, и вам нужно будет использовать:

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
}

Если вы используете UIDocumentPickerViewController для выбора нескольких документов, вам нужно будет установить для свойства allowsMultipleSelection значение true и реализовать

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
}

Также будет достаточно следующей строки.

present(documentPicker, animated: true)
person Prashant    schedule 20.11.2018
comment
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { } устарел для iOS 11. Поэтому использование documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) { } не имеет смысла. Также я пробовал установить allowsMultipleSelection, не помогает. - person Vedant Shirke; 20.11.2018
comment
Тогда обратитесь к документации. Я дал вам фрагменты кода, которые я использовал и которые работают, протестированы на устройстве перед публикацией. - person Prashant; 20.11.2018
comment
developer.apple.com/documentation/uikit/ - person Prashant; 20.11.2018
comment
Кроме того, если решение работает для вас (поскольку опубликовано более одного), пожалуйста, выберите его в качестве принятого ответа, это поможет другим пользователям. - person Prashant; 20.11.2018

Я использовал эти методы в Swift 3

func openImportDocumentPicker() {
    let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.item"], in: .import)
    documentPicker.delegate = self
    documentPicker.modalPresentationStyle = .formSheet
    self.present(documentPicker, animated: true, completion: { _ in })
}

func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {
    if controller.documentPickerMode == .import {
        let alertMessage: String = "Successfully imported \(url.absoluteURL)"
   }
}

func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
    print("Cancelled")
}
person sukh.ios    schedule 20.11.2018

Попробуйте на устройстве. Симулятор не работал у меня, когда я вошел в iCloud и попытался просмотреть каталог.

person Luke    schedule 21.09.2019