Пожалуйста, может кто-нибудь помочь. Я хотел бы добавить предупреждающее сообщение, когда пользователь нажимает кнопку «Поделиться» в средстве просмотра PDF, я использую UIDocumentInteractionController для предварительного просмотра документа PDF. и я хотел знать, есть ли какие-либо методы или функции делегата, которые я могу переопределить, где я могу добавить свое предупреждение перед открытием листа обмена?[![введите описание изображения здесь][1]][1]

class ViewController: UIViewController {
    
    var documentController : UIDocumentInteractionController!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction private func buttonTapped(_ sender: Any) {
        
       guard let fileURL = Bundle.main.url(forResource: "infomation", withExtension: "pdf") else {return}
        documentController = UIDocumentInteractionController.init(url: fileURL)
        documentController.delegate = self
        documentController.presentPreview(animated: true)
    }
}

extension ViewController: UIDocumentInteractionControllerDelegate {
    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
        
        return self
    }
    
    func documentInteractionControllerWillPresentOpenInMenu(_ controller: UIDocumentInteractionController) {
  
    }
    
    func documentInteractionControllerWillPresentOptionsMenu(_ controller: UIDocumentInteractionController) {
    
    }
    
    func documentInteractionController(_ controller: UIDocumentInteractionController, willBeginSendingToApplication application: String?) {
    
    }
}

Но ни один из них не вызывается, когда я нажимаю кнопку «Поделиться», хотя я установил делегата в качестве моего контроллера представления. Есть ли способ, которым я могу это сделать?

0
swift_dande 12 Янв 2022 в 12:18
Не вы ли создали эту кнопку share? Вы должны добавить свой код в функцию/селектор обратного вызова при нажатии кнопки share. Это UIBarButton
 – 
Brandon
12 Янв 2022 в 23:23
Привет Брэндон. нет, я не создавал кнопку «Поделиться», она добавляется автоматически, когда вы используете UIDocumentInteractionController для предварительного просмотра документа PDF. Вот что я хотел узнать, есть ли обратный вызов, который я могу использовать. я отредактировал вопрос, надеюсь, теперь все ясно
 – 
swift_dande
12 Янв 2022 в 23:46

1 ответ

Лучший ответ

Объяснение:

Невозможно сделать это, не взламывая все вместе, повторяя все подпредставления и переопределяя действие и цель кнопки.

Один простой способ — создать свой собственный контроллер предварительного просмотра, как показано ниже. Если вы добавите QLPreviewController в UINavigationController, он автоматически создаст bottom toolbar, который вам не нужен. Чтобы обойти это, вы добавляете его в качестве дочернего контроллера обычного UIViewController и создаете пользовательскую панель навигации.

Вы также можете использовать UTI вместо UIActivityItem, чтобы определить, как можно поделиться элементом. Я реализовал только предварительный просмотр и основные возможности обмена, но все остальное должно быть очень легко сделать, и, по крайней мере, оно более настраиваемое, чем UIDocumentInteractionController, поскольку у вас есть полный контроль над всем.

Теперь код, который все это делает:

//
//  ViewController.swift
//  CustomDocumentController
//
//  Created by brandon on 2022-01-13.
//

import UIKit
import QuickLook
import MobileCoreServices
import UniformTypeIdentifiers

private class PreviewItem: NSObject, QLPreviewItem {
    var previewItemURL: URL?
    var previewItemTitle: String?
    
    init(title: String, url: URL) {
        super.init()
        
        previewItemURL = url
        previewItemTitle = title
    }
}

class DocumentInteractionController: UIViewController {
    
    private let url: URL
    
    private lazy var navigationBar: UINavigationBar = {
        let navigationBar = UINavigationBar()
        let navigationItem = UINavigationItem(title: name ?? "Document")
        navigationItem.hidesBackButton = true
        navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(onDone))
        navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(onShare)) //UIImage(systemName: "square.and.arrow.up")
        navigationBar.pushItem(navigationItem, animated: false)
        return navigationBar
    }()
    
    private lazy var previewController: QLPreviewController = {
        let previewController = QLPreviewController()
        previewController.title = name
        previewController.dataSource = self
        previewController.delegate = self
        previewController.reloadData()
        return previewController
    }()
    
    var uti: String? {
        didSet {
            previewController.reloadData()
        }
    }
    
    var name: String? {
        didSet {
            previewController.title = name
            navigationBar.topItem?.title = name
        }
    }
    
    init(url: URL) {
        self.url = url
        super.init(nibName: nil, bundle: nil)
        //super.init(rootViewController: self.previewController)
        self.modalPresentationStyle = .fullScreen
        
        name = (try? url.resourceValues(forKeys: [.localizedNameKey]))?.localizedName
        uti = (try? url.resourceValues(forKeys: [.typeIdentifierKey]))?.typeIdentifier
        
        if uti == nil {
            if #available(iOS 15.0, *) {
                uti = UTType.url.identifier
            } else {
                uti = String(kUTTypeURL)
            }
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        addChild(previewController)
        previewController.didMove(toParent: self)
        
        let separator = UIView()
        separator.backgroundColor = .lightGray
        
        view.addSubview(navigationBar)
        view.addSubview(separator)
        view.addSubview(previewController.view)
        
        NSLayoutConstraint.activate([
            navigationBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            navigationBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            navigationBar.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
            
            separator.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            separator.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            separator.topAnchor.constraint(equalTo: navigationBar.bottomAnchor),
            separator.heightAnchor.constraint(equalToConstant: 1.0 / UIScreen.main.scale),
            
            previewController.view.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
            previewController.view.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
            previewController.view.topAnchor.constraint(equalTo: separator.bottomAnchor),
            previewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
        
        [navigationBar, separator, previewController.view].forEach({
            $0?.translatesAutoresizingMaskIntoConstraints = false
        })
        
        navigationBar.barTintColor = previewController.view.backgroundColor
        view.backgroundColor = previewController.view.backgroundColor
    }
}

extension DocumentInteractionController: QLPreviewControllerDelegate, QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return PreviewItem(title: name ?? "Document", url: url)
    }
}

extension DocumentInteractionController {
    @objc
    private func onDone() {
        self.dismiss(animated: true, completion: nil)
    }
    
    @objc
    private func onShare() {
        let activityViewController = UIActivityViewController(activityItems: [url],
                                                              applicationActivities: nil)
        
        activityViewController.excludedActivityTypes = [.assignToContact]
        if UIDevice.current.userInterfaceIdiom == .pad {
            activityViewController.popoverPresentationController?.sourceView = self.view
        }
        self.present(activityViewController, animated: true, completion: nil)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = Bundle.main.url(forResource: "Testing", withExtension: ".md")
        let doc = DocumentInteractionController(url: url!)
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            self.present(doc, animated: true, completion: nil)
        }
    }
}

< Сильный > Скриншоты :

Image-1 Image-2

1
Brandon 13 Янв 2022 в 21:17