xcode 与 UIActivityViewController 共享 PDF 文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/48860593/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-15 10:33:50  来源:igfitidea点击:

share PDF file with UIActivityViewController

iosswiftxcodeswift4

提问by farad

I am trying to share a PDF file using UIActivityViewControllerbut when I press the button I do not have options to share the file How can I show these options ?

我正在尝试使用共享 PDF 文件,UIActivityViewController但是当我按下按钮时,我没有共享文件的选项 如何显示这些选项?

![](https://i.stack.imgur.com/ywDQw.jpg

![]( https://i.stack.imgur.com/ywDQw.jpg

import UIKit
import PDFKit
import MessageUI
import UIKit.UIGestureRecognizerSubclass

class BookViewController: UIViewController, UIPopoverPresentationControllerDelegate, PDFViewDelegate, ActionMenuViewControllerDelegate, OutlineViewControllerDelegate, MFMailComposeViewControllerDelegate {

    @IBOutlet weak var btn: UIButton!

    var pdfDocument: PDFDocument?

    @IBOutlet weak var pdfView: PDFView!
    @IBOutlet weak var webview: UIWebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        pdfView.autoScales = true
        pdfView.displayMode = .singlePage
        pdfView.displayDirection = .horizontal
        pdfView.usePageViewController(true, withViewOptions: [UIPageViewControllerOptionInterPageSpacingKey: 20])

        pdfView.document = pdfDocument
        resume()


        // ActivityViewController
    }


    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
        coordinator.animate(alongsideTransition: { (context) in
        }, completion: nil)
    }

    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    func actionMenuViewControllergmailDocument(_ actionMenuViewController: ActionMenuViewController) {

    }

    func actionMenuViewControllerShareDocument(_ actionMenuViewController: ActionMenuViewController) {


    }

    func actionMenuViewControllerPrintDocument(_ actionMenuViewController: ActionMenuViewController) {

    }

    func outlineViewController(_ outlineViewController: OutlineViewController, didSelectOutlineAt destination: PDFDestination) {
        resume()
        pdfView.go(to: destination)
    }

    private func resume() {
        let backButton = UIBarButtonItem(image: #imageLiteral(resourceName: "Chevron"), style: .plain, target: self, action: #selector(back(_:)))
        let actionButton = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(showActionMenu(_:)))
        navigationItem.leftBarButtonItems = [backButton, actionButton]
        pdfView.isHidden = false
    }

    @objc func resume(_ sender: UIBarButtonItem) {
        resume()
    }

    @objc func back(_ sender: UIBarButtonItem) {
        navigationController?.popViewController(animated: true)
    }

    @objc func showActionMenu(_ sender: UIBarButtonItem) {
        if let viewController = storyboard?.instantiateViewController(withIdentifier: String(describing: ActionMenuViewController.self)) as? ActionMenuViewController {
            let activityVC = UIActivityViewController(activityItems: [self.pdfDocument!], applicationActivities: nil)
            activityVC.popoverPresentationController?.sourceView = self.view

            self.present(activityVC, animated: true, completion: nil)
        }
    }
}

回答by Jogendra.Com

Try like this

像这样尝试

let fileManager = FileManager.default 
let docsurl = try! fileManager.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let documentoPath =  docsurl.appendingPathComponent("yourfile.pdf") 

if fileManager.fileExists(atPath: documentoPath){              
   let pdfData = NSData(contentsOfFile: documentoPath) 
    var activityViewController = UIActivityViewController(activityItems: ["Your title that you wanna share", pdfData], applicationActivities: nil)   // and present it
    present(activityViewController, animated: true) {() -> Void in }
}

Its working fine ... I use it .

它工作正常......我使用它。

回答by oscar castellon

In SWIFT 4

在 SWIFT 4

@IBAction func sharePDF(_ sender: : Any) {

    let fm = FileManager.default

    var pdfURL = (fm.urls(for: .documentDirectory, in: .userDomainMask)).last! as URL
    pdfURL = pdfURL.appendingPathComponent("GridLines.pdf") as URL

    //Rename document name to "Hello.pdf"
    let url = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("Hello.pdf") as NSURL

    do {
        let data = try Data(contentsOf: pdfURL)

        try data.write(to: url as URL)

        let activitycontroller = UIActivityViewController(activityItems: [url], applicationActivities: nil)
        if activitycontroller.responds(to: #selector(getter: activitycontroller.completionWithItemsHandler))
        {
            activitycontroller.completionWithItemsHandler = {(type, isCompleted, items, error) in
                if isCompleted
                {
                    print("completed")
                }
            }
        }

        activitycontroller.excludedActivityTypes = [UIActivityType.airDrop]
        activitycontroller.popoverPresentationController?.sourceView = self.view
        self.present(activitycontroller, animated: true, completion: nil)

    }
    catch {
        //ERROR
    }
}

回答by ymerej

You already have a PDFDocument object, so reconstructing the file url is unnecessary. Simply pass your PDFDocument's documentURLproperty instead:

您已经有一个 PDFDocument 对象,因此无需重新构建文件 url。只需传递您的 PDFDocument 的documentURL属性:

let activityVC = UIActivityViewController(activityItems: [self.pdfDocument!.documentURL!], applicationActivities: nil)

回答by Kamlesh Shingarakhiya

Try with this

试试这个

let fileManager = FileManager.default 
let docsurl = try! fileManager.url(for:.documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let documentoPath =  docsurl.appendingPathComponent("documento.pdf") 

if fileManager.fileExists(atPath: documentoPath){              
   let documento = NSData(contentsOfFile: documentoPath) 
   let activityViewController: UIActivityViewController = 
   UIActivityViewController(activityItems: [documento!], 
   applicationActivities: nil) 

 activityViewController.popoverPresentationController?.sourceView=self.view 
                present(activityViewController, animated: true, completion: nil) 
            } 
            else { 
                print("document was not found") 
            }