Как открыть файлы документов, например (.pdf, .doc, .docx) в ios mobile при нажатии кнопки с использованием swift3.0?

Мне нужно открыть UIDocumentPickerViewController, и он должен позволить пользователю выбирать все типы файлов. т.е.(.pdf,.doc) файлы я использовал метод UIDocumentPickerViewController. мой код:

UIDocumentPickerDelegate, UIDocumentMenuDelegate в моем объявлении класса

//загрузить файл

func OpenFile(){

    let importMenu = UIDocumentMenuViewController(documentTypes: [String(kUTTypePNG),String(kUTTypeImage)], in: .import)
    importMenu.delegate = self
    importMenu.modalPresentationStyle = .fullScreen
    self.present(importMenu, animated: true, completion: nil)

}
@available(iOS 8.0, *)
public func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentAt url: URL) {        
    let cico = url as URL
    print("The Url is : \(cico)")

    do {
        let weatherData = try NSData(contentsOf: cico, options: NSData.ReadingOptions())
        print(weatherData)
        let activityItems = [weatherData]
        let activityController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
        if UI_USER_INTERFACE_IDIOM() == .phone {
            self.present(activityController, animated: true, completion: { _ in })
        }
        else {
            let popup = UIPopoverController(contentViewController: activityController)
            popup.present(from: CGRect(x: CGFloat(self.view.frame.size.width / 2), y: CGFloat(self.view.frame.size.height / 4), width: CGFloat(0), height: CGFloat(0)), in: self.view, permittedArrowDirections: .any, animated: true)
        }

    } catch {
        print(error)
    }

    //optional, case PDF -> render
    //displayPDFweb.loadRequest(NSURLRequest(url: cico) as URLRequest)      


}

@available(iOS 8.0, *)
public func documentMenu(_ documentMenu:     UIDocumentMenuViewController, didPickDocumentPicker documentPicker: UIDocumentPickerViewController) {

    documentPicker.delegate = self
    present(documentPicker, animated: true, completion: nil)        
} 


func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {

    print(" cancelled by user")

    dismiss(animated: true, completion: nil)        

}

В этом коде приложение вылетает. причина Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'You cannot initialize a UIDocumentPickerViewController except by the initWithDocumentTypes:inMode: and initWithURL:inMode: initializers.

Я не знаю, как инициализировать initWithDocumentTypes:inMode. Я новичок в iOS, кто-нибудь мне поможет??? не могли бы вы мне помочь..


person mouni    schedule 18.12.2017    source источник


Ответы (3)


Свифт 3*, 4*,

Чтобы открыть документ и выбрать любой документ, вы используете UIDocumentPickerViewController, тогда все документы, представленные в вашем iCloud, файлах и на Google Диске, будут показаны, если Google Диск подключен к пользовательскому устройству. Затем выбранный документ необходимо загрузить в ваше приложение, и оттуда вы можете показать его в WKWebView,

   @IBAction func uploadNewResumeAction(_ sender: Any) {

  /*  let documentPicker = UIDocumentPickerViewController(documentTypes: ["com.apple.iwork.pages.pages", "com.apple.iwork.numbers.numbers", "com.apple.iwork.keynote.key","public.image", "com.apple.application", "public.item","public.data", "public.content", "public.audiovisual-content", "public.movie", "public.audiovisual-content", "public.video", "public.audio", "public.text", "public.data", "public.zip-archive", "com.pkware.zip-archive", "public.composite-content", "public.text"], in: .import) */

    let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.text", "com.apple.iwork.pages.pages", "public.data"], in: .import)

    documentPicker.delegate = self
    present(documentPicker, animated: true, completion: nil)
}

   extension YourViewController: UIDocumentPickerDelegate{


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

                let cico = url as URL
                print(cico)
                print(url)

                print(url.lastPathComponent)

                print(url.pathExtension)

               }
   }

Примечание. Если вы собираетесь выбрать все файлы, вам необходимо использовать следующий код:

  let documentPicker = UIDocumentPickerViewController(documentTypes: ["com.apple.iwork.pages.pages", "com.apple.iwork.numbers.numbers", "com.apple.iwork.keynote.key","public.image", "com.apple.application", "public.item","public.data", "public.content", "public.audiovisual-content", "public.movie", "public.audiovisual-content", "public.video", "public.audio", "public.text", "public.data", "public.zip-archive", "com.pkware.zip-archive", "public.composite-content", "public.text"], in: .import) 

В вашем методе действия.

person Abhishek Mitra    schedule 18.12.2017
comment
Привет, Абхишек, тогда как загрузить документ на сервер. - person mouni; 18.12.2017
comment
@mouni ну, это очень просто, если вы можете выбрать документ из UIDocumentPickerViewController , вы получите путь к файлу print(url) из моего кода выше. и вам нужно посмотреть на этот ответ: stackoverflow.com/questions/47754252/ Затем этот файл необходимо загрузить, как и любой другой, например, для загрузки изображений на сервер. - person Abhishek Mitra; 18.12.2017
comment
У меня возникает ошибка Завершение приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «В средстве выбора документов, инициализирующем приложение, отсутствует право на iCloud. Идентификаторы com.apple.developer.icloud-container-identifier установлены? - person mouni; 18.12.2017
comment
@mouni, когда ты нашел аварию? в какой операции? - person Abhishek Mitra; 18.12.2017
comment
Я использую uiactionsheet. когда я нажимаю действие файла, происходит сбой. Я могу использовать свое действие с файлом: , завершение: ноль) - person mouni; 18.12.2017
comment
@mouni отключите iCloud, для этого просмотрите это изображение: imgur.com/a/ntubG - person Abhishek Mitra; 18.12.2017
comment
Я все так отключился от iColoud. все еще у меня есть ошибка *** Ошибка утверждения в -[UIDocumentPickerViewController _commonInitWithCompletion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.9.1/UIDocumentPickerViewController.m:91 Завершение приложения из-за необработанное исключение «NSInternalInconsistencyException», причина: «Приложению, инициализирующему средство выбора документов, не хватает права iCloud. Идентификаторы com.apple.developer.icloud-container-identifier установлены? - person mouni; 18.12.2017
comment
@mouni хорошо, в таком случае мне нужно заглянуть в ваш код, иначе будет невозможно решить эту проблему, увидев только это сообщение об ошибке. - person Abhishek Mitra; 18.12.2017
comment
@mouni, когда ты нашел аварию? когда вы вызываете метод делегата actionSheet в то время? Здесь я не могу скомпилировать ваш код таким образом. - person Abhishek Mitra; 18.12.2017
comment
Я нажимаю кнопку «Файл», и происходит сбой. - person mouni; 18.12.2017
comment
функция func OpenFile(){ }. takefile() не нужен. Я скрываю функцию. - person mouni; 18.12.2017
comment
Что ж, в соответствии с вашим кодом вы вызываете свой OpenFile() из actionSheet, и когда OpenFile() вызывается, он, по вашему мнению, падает. Ну, здесь я не нашел ничего необычного, кроме того, что вы можете попробовать DispatchQueue.main.async { print("Async1") } Также, можете ли вы сказать, если компилятор вводит в didPickDocumentAt этот метод делегата? - person Abhishek Mitra; 18.12.2017
comment
@mouni, вы можете попробовать это func OpenFile(){ self.dismiss(animated: true, completion: nil) let documentPicker = UIDocumentPickerViewController(documentTypes: ["public.text", "com.apple.iwork.pages.pages", "public.data"], in: .import) documentPicker.delegate = self present(documentPicker, animated: true, completion: nil) } Замените этот код своим OpenFile(){} - person Abhishek Mitra; 18.12.2017
comment
Я заменяю его, но все еще завершаю работу приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «В средстве выбора документов, инициализирующем приложение, отсутствует право на iCloud. Идентификаторы com.apple.developer.icloud-container-identifier установлены? - person mouni; 18.12.2017
comment
@mouni ну без компиляции невозможно обнаружить основную проблему. По крайней мере, я не могу. - person Abhishek Mitra; 18.12.2017
comment
Большое спасибо, я понял ... наконец-то я на драйвере iCloud. это работает нормально. спасибо, Абхишек :) - person mouni; 18.12.2017
comment
Как мы можем включить одиночный выбор? Создание documentPicker.allowsMultipleSelection = true означает только выбор всех документов одновременно, но как мы можем включить одиночный и множественный выбор с этими боковыми миниатюрами в качестве свойства по умолчанию для выбора изображения, а также в iOS? - person Neeraj Shukla; 20.02.2021

На самом деле, вместо WebView вы также можете использовать QuickLook Framework, который предназначен именно для этой цели. Вы просто передаете местоположение файла и соответствуете протоколам. Он представит контроллер представления с документом внутри.

Он поддерживает следующий файл:

– Документы iWork (Pages, Numbers и Keynote)

– Документы Microsoft Office (если они были созданы с помощью Office 97 или любой другой более новой версии)

– PDF-файлы

– Изображения

– Текстовые файлы

– Документы в формате RTF

– Файлы значений, разделенных запятыми (csv)

Здесь – руководство от APPCODA, в котором описывается то же самое. .

и

Здесь — это руководство, предоставляемое версией Apple OBJ-C.

person Umar Farooque    schedule 18.12.2017
comment
Прохладно! Рад, что помогло! - person Umar Farooque; 02.05.2018
comment
Это должен быть принятый ответ. QuickLook Framework — лучший способ визуализации документов без использования WebView. - person Velociround; 03.12.2018

Чтобы открыть определенные файлы документов (.pdf, .doc, .docx) с помощью UIDocumentPickerViewController в Swift: documentTypes будет

импортировать import MobileCoreServices

["com.microsoft.word.doc","org.openxmlformats.wordprocessingml.document", kUTTypePDF as String]

Пример:

let importMenu = UIDocumentPickerViewController(documentTypes: ["com.microsoft.word.doc","org.openxmlformats.wordprocessingml.document", kUTTypePDF as String], in: UIDocumentPickerMode.import) 
importMenu.delegate = self 
self.present(importMenu, animated: true, completion: nil)
person Himanshu padia    schedule 30.07.2018
comment
Да, это для xls файла. - person Himanshu padia; 17.10.2019