在 swift 5 中隐藏或禁用 uidocumentinteractioncontroller 的共享按钮

2023-12-08

在我的应用程序中,我使用 QuickLook 框架来查看文档文件,例如 pdf、ppt、doc 等。但出于隐私考虑,我不希望用户可以与其他人共享此文档,所以请让我知道如何禁用/隐藏共享按钮以及复制粘贴选项。

我知道这个问题可以被问很多次并尝试了很多解决方案,但对我来说没有任何作用

  1. 从 QLPreviewController 隐藏共享按钮
  2. UIDocumentInteractionController 删除操作菜单
  3. 如何使用 swift 隐藏 QLPreviewController 中的共享按钮?
  4. 隐藏 QLPreviewController 的右键?

请建议我实现这一目标。

这是我的演示代码:

import UIKit
import QuickLook

class ViewController: UIViewController {
    
    lazy var previewItem = NSURL()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    @IBAction func displayLocalFile(_ sender: UIButton){
        
        let previewController = QLPreviewController()
        // Set the preview item to display
        self.previewItem = self.getPreviewItem(withName: "samplePDf.pdf")
        
        previewController.dataSource = self
        self.present(previewController, animated: true, completion: nil)
        
    }
    
    @IBAction func displayFileFromUrl(_ sender: UIButton){
        
        // Download file
        self.downloadfile(completion: {(success, fileLocationURL) in
            
            if success {
                // Set the preview item to display======
                self.previewItem = fileLocationURL! as NSURL
                // Display file
                let previewController = QLPreviewController()
                previewController.dataSource = self
                self.present(previewController, animated: true, completion: nil)
            }else{
                debugPrint("File can't be downloaded")
            }
        })
    }
    
    
    
    func getPreviewItem(withName name: String) -> NSURL{
        
        //  Code to diplay file from the app bundle
        let file = name.components(separatedBy: ".")
        let path = Bundle.main.path(forResource: file.first!, ofType: file.last!)
        let url = NSURL(fileURLWithPath: path!)
        
        return url
    }
    
    func downloadfile(completion: @escaping (_ success: Bool,_ fileLocation: URL?) -> Void){
        
        let itemUrl = URL(string: "https://images.apple.com/environment/pdf/Apple_Environmental_Responsibility_Report_2017.pdf")
        
        // then lets create your document folder url
        let documentsDirectoryURL =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        
        // lets create your destination file url
        let destinationUrl = documentsDirectoryURL.appendingPathComponent("filename.pdf")
        
        // to check if it exists before downloading it
        if FileManager.default.fileExists(atPath: destinationUrl.path) {
            debugPrint("The file already exists at path")
            completion(true, destinationUrl)
            
            // if the file doesn't exist
        } else {
            
            // you can use NSURLSession.sharedSession to download the data asynchronously
            URLSession.shared.downloadTask(with: itemUrl!, completionHandler: { (location, response, error) -> Void in
                guard let tempLocation = location, error == nil else { return }
                do {
                    // after downloading your file you need to move it to your destination url
                    try FileManager.default.moveItem(at: tempLocation, to: destinationUrl)
                    print("File moved to documents folder")
                    completion(true, destinationUrl)
                } catch let error as NSError {
                    print(error.localizedDescription)
                    completion(false, nil)
                }
            }).resume()
        }
    }
    
}

//MARK:- QLPreviewController Datasource

extension ViewController: QLPreviewControllerDataSource {
    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }
    
    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        controller.navigationItem.rightBarButtonItem = nil
        return self.previewItem as QLPreviewItem
    }
}


请提供您的建议或任何其他框架来查看不同的文件格式。

这是图像


下面找到了我对代码的处理方法(经过修改以在本地测试,但代码应该清晰)。这个想法是

a) 重写,这是API完全允许的,需要类来拦截修改

b) 有意使用自己的 UINavigationController,因为堆栈中只能有一个导航控制器

所以这是代码:

// Custom navigation item that just blocks adding right items
class MyUINavigationItem: UINavigationItem {
    override func setRightBarButtonItems(_ items: [UIBarButtonItem]?, animated: Bool) {
        // forbidden to add anything to right
    }
}

// custom preview controller that provides own navigation item
class MyQLPreviewController: QLPreviewController {
    private let item = MyUINavigationItem(title: "")

    override var navigationItem: UINavigationItem {
        get { return item }
    }
}

class MyViewController : UIViewController, QLPreviewControllerDataSource {
    lazy var previewItem = NSURL()
    override func loadView() {
        let view = UIView()
        view.backgroundColor = .white

        // just stub testing code
        let button = UIButton(type: .roundedRect)
        button.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
        button.setTitle("Show", for: .normal)
        button.addTarget(self, action: 
                         #selector(displayLocalFile(_:)), for: .touchDown)
        view.addSubview(button)
        self.view = view
    }

    @objc func displayLocalFile(_ sender: UIButton){

        let previewController = MyQLPreviewController() // << custom preview
        // now navigation item is fully customizable
        previewController.navigationItem.title = "samplePDF.pdf"
        previewController.navigationItem.leftBarButtonItem = 
            UIBarButtonItem(barButtonSystemItem: .done, target: self, 
                            action: #selector(closePreview(_:)))

        // wrap it into navigation controller
        let navigationController = UINavigationController(rootViewController: previewController)
        // Set the preview item to display
        self.previewItem = self.getPreviewItem(withName: "samplePDF.pdf")

        previewController.dataSource = self
        // present navigation controller with preview
        self.present(navigationController, animated: true, completion: nil)
    }

    @objc func closePreview(_ sender: Any?) {
        self.dismiss(animated: true) // << dismiss preview
    }

    func getPreviewItem(withName name: String) -> NSURL{

        //  Code to diplay file from the app bundle
        let file = name.components(separatedBy: ".")
        let path = Bundle(for: type(of: self)).path(forResource: file.first!, ofType: file.last!)
        let url = NSURL(fileURLWithPath: path!)

        return url
    }

    func numberOfPreviewItems(in controller: QLPreviewController) -> Int {
        return 1
    }

    func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
        return self.previewItem as QLPreviewItem
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 swift 5 中隐藏或禁用 uidocumentinteractioncontroller 的共享按钮 的相关文章

  • 是否有针对不同屏幕尺寸的单独故事板?

    基本上我已经完成了一个应用程序 我唯一的问题是 ATM 机应用程序在设计时只考虑了 4 英寸显示屏 当在 3 5 英寸模拟器上运行时 应用程序会丢失 0 5 英寸 显然 那么我的问题是 如何在 Xcode 5 中为不同的屏幕尺寸设置不同的故
  • 如何在IOS中的UIStackView中设置权重

    UIStackView与安卓类似LinearLayout但我不知道如何设置子视图的权重 假设我有一个垂直的UIStackView and 3 UIImageView就在里面 我想连续设置权重3 6 1UIImageViews 我怎么做 UI
  • UIButton 导致无法识别的选择器发送到实例

    我正在尝试使用 for 循环创建多个按钮 但在使用 sender 函数时遇到问题 我有以下代码 func setUpButtons for i in 1 3 let btn UIButton UIButton frame CGRect x
  • 如何打开定位服务

    当有人第一次拒绝时 如何从实际应用程序重新打开定位服务 我可以选择关闭或打开它 您只能提示他们在屏幕上打开定位服务 如下所示 UIApplication sharedApplication openURL NSURL URLWithStri
  • 打乱 NSMutableArray 而不重复并显示在 UIButton 中

    在我看来 我有 12 个按钮 一个数组包含 6 个名称 我想在其中打印数组名称UIButton标题 这是我的代码 texts NSMutableArray alloc initWithObjects 1 2 3 4 5 6 nil UIBu
  • 在没有预览窗口的情况下使用 AVCaptureVideoDataOutputSampleBufferDelegate

    我正在开发一个基于 Swift 的 macOS 应用程序 我需要捕获视频输入 但不将其显示在屏幕上 而不是显示视频 我想将缓冲的数据发送到其他地方进行处理 并最终显示它在 a 中的一个物体上SceneKit scene 我有一个Camera
  • 在 WKWebView 中禁用放大手势

    我正在寻找一种方法来禁用 WKWebView 的 iOS 实现上的 捏合缩放 放大手势 OS X 有一个 magnification BOOL 属性 但在 iOS 上似乎不可用 WKWebView h if TARGET OS IPHONE
  • 在横向中自动调整 UITableCells 内容的大小

    在 UITableView 中 我通过 UILabels 将内容添加到单元格中 定义最佳尺寸 与单元格宽度允许的一样大 我注意到只有tableView contentSize width是可靠的 因为cell contentView bou
  • 如何知道我的应用程序使用了多少 iCloud 空间?

    有没有办法查看我的应用程序正在备份到 iCloud 的内容以及它消耗了多少内存 Settings gt iCloud gt Storage Backup gt Manage Storage将显示正在备份的总计内容 iOS 会备份位于应用程序
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 从“NSPercientStoreResult”转换为不相关类型“Entity”总是失败

    我正在创建一个小应用程序来学习 CoreData 中的多对多关系 但是 使用下面的代码 从 NSFetchResult 到实体类 Groepering 的转换出现错误 与我的项目相比 我在互联网上找到的示例没有看到任何差异 为什么转换仍然失
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 是否可以使用 Firebase 安排推送通知? [复制]

    这个问题在这里已经有答案了 我已经阅读了我能找到的所有文档 但仍然不知道这是否可行 如果我是用户 我可以安排特定时间的推送通知吗 Example 1 我是用户并打开应用程序 2 我允许通知并转到 pickerView 或其他任何内容 并设置
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • 在 Swift 中从 UIScrollView 创建 PDF 文件

    我想从 UIScrollView 的内容创建一个 PDF 文件 func createPdfFromView aView UIView saveToDocumentsWithFileName fileName String let pdfD
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • UIButton的高亮状态由什么控制事件开始和结束

    我正在创建类似钢琴的视图UIButton作为钢琴键 什么UIControlEvents当按钮获得和失去突出显示状态时 我应该监听以获得回调吗 我试图创建子类UIButton并添加属性观察者highlighted并且运行良好 然而 有时我需要
  • 在 iOS 中,如何创建一个始终位于所有其他视图控制器之上的按钮?

    无论是否呈现模态或用户执行任何类型的转场 有没有办法让按钮在整个应用程序中 始终位于顶部 而不是屏幕顶部 有什么方法可以让这个按钮可拖动并可捕捉到屏幕上吗 我正在以苹果自己的辅助触摸作为此类按钮的示例 您可以通过创建自己的子类来做到这一点U
  • 如何让按钮闪烁?

    我试图在扫描正确时将按钮的颜色 只是闪烁 闪烁 更改为绿色 在出现问题时将按钮的颜色更改为红色 我可以用这样的视图来做到这一点 func flashBG UIView animateWithDuration 0 7 animations s
  • 在 iOS 7 Safari 中,如何区分通过边缘滑动与后退/前进按钮的 popstate 事件?

    在 iOS 7 Safari 中 现在有两种后退 前进导航方式 使用底部的传统后退 前进按钮箭头或从屏幕边缘滑动 我正在使用动画在 ajax 应用程序中的页面之间进行转换 但如果用户通过边缘滑动进行导航 我不想触发该转换 因为这本身就是一个

随机推荐

  • Java 泛型方法重写

    我有界面 public interface CartService extends RemoteService
  • 如何使用 npm 发布客户端脚本?

    我的 Nodejs 包包含在后端执行的代码以及在浏览器上执行的单个 js 文件 要使用浏览器脚本 必须将其放入script显然 HTML 文件中的元素 我的问题是 是否存在关于浏览器 js 文件如何以独立于 webpack gulp gru
  • pandas from_json 方法用法

    我有一个如下所示的 JSON 文件 A 1 B 2 C x 1 y 2 z 3 x 2 y 7 z 77 pandas from json返回包含 A B 和 C 列的数据框 但是 实际上我正在寻找包含 x y 和 z 的列 有办法得到吗
  • 使用Python子进程将stdout重定向到stdin?

    我正在使用 subprocess 模块从 shell 调用程序 该模块将二进制文件输出到 STDOUT 我使用 Popen 调用程序 然后我想将流传递给 Python 包 称为 pysam 中的函数 不幸的是 该函数不能使用 Python
  • 使用 DX:AX 装配 x86 划分

    我正在使用 masm 遇到了一个我不太明白如何解决的场景 例如 X A C D 如果我先乘以 C D 我的值是 DX AX 据我所知 我不能将其用作除数 如果我将 A C 和 A D 分开进行除法 我就会面临失去精度的风险 来自提醒等 实现
  • 从名称实例化泛型的最佳方法是什么?

    假设我只有 MyCustomGenericCollection of MyCustomObjectClass 形式的字符串形式的泛型类名 并且不知道它来自哪个程序集 那么创建该对象的实例的最简单方法是什么 如果有帮助 我知道该类实现 IMy
  • Tomcat连接池,为Web应用程序安装jdbc驱动程序

    我正在制作一个网络应用程序Tomcat 6作为容器 我正在尝试使用连接池 我正在使用的jdbc驱动程序是jtds 1 2 2 当驱动程序 jar 放在下面时 池工作正常 Catalina Home lib 但我的托管提供商不允许我这样做 当
  • 最佳实践:在 PHP 中使用长的多行字符串?

    注意 如果这是一个非常简单的问题 我很抱歉 但我对代码的格式有点强迫症 我有一个类 它有一个函数返回一个字符串 该字符串将构成电子邮件的正文 我希望该文本经过格式化 以便在电子邮件中看起来正确 但也不会让我的代码看起来很时髦 这就是我的意思
  • 核心数据对象唯一ID

    我想向我的托管对象实体模型添加一个唯一的 ID 字段 我知道核心数据不使用 ID 关系 但这是不同的 我需要一种将线程安全数据传递给不同线程的方法 以便新线程可以从该数据中获取托管对象 它可以是任何格式 但最好只是单个对象 变量 值 我可以
  • SQL 错误:ORA-00907:缺少右括号

    我正在使用 Oracle SQL Developer 使用以下命令创建一个基本表 CREATE TABLE chartered flight flight no NUMBER 4 PRIMARY KEY customer id FOREIG
  • 创建仅包含给定类的对象的数组

    好的 我有下面的代码 Objective C FYI 我想知道是否要创建一个 NSMutableArrayc data对象 我该怎么做呢 这有点像声明一个List
  • 如何将用户输入保存在数组中?

    我正在尝试编写一个程序 要求用户输入要保存在医院数据库中的患者数量 即ArraySize 用户必须输入患者的 ID 名字和姓氏 然后根据患者病情的严重程度在数组中对患者的 ID 名字和姓氏进行索引 我的问题是如何将用户输入的 ID 保存为整
  • 测试非默认 App Engine 任务队列

    App Engine 文档给出了example单元测试任务队列 这对于 默认 队列工作正常 但我需要对非默认队列进行单元测试 我从以下行中得到异常 val qsi ltq getQueueStateInfo get non default
  • 当我保存文件时 Sublime Text 正在做什么?

    我正在观看文件fsnotify这是一个Go库 我发现保存文件时会触发很多事件 为什么 Sublime Text 有这么多功能 2013 12 17 20 46 25 event parser go MODIFY 2013 12 17 20
  • 如果另一个值不存在,如何根据一个值从表中选择项目? (雄辩/sql)

    我有一个表 用于存储网站的不同文本块 我目前正在为每个页面选择正确的块以及页面的标题和首选语言 当首选语言不可用时 我想在后备语言中选择相同的文本块 具有相同的标题 块表 columns id slug title language con
  • java.lang.UnsatisfiedLinkError:dlopen 失败:

    当我在项目中添加 so 文件时 我遇到了这个问题 从其他答案来看 我尝试了不同的解决方案 但没有任何解决方案可以帮助我 case 1我曾尝试将 so 放入 src main jniLibs 中 并在 gradle 文件中添加以下行 但出现相
  • 在Java中,当另一个音频文件开始使用key_events时,如何停止前一个音频文件

    我知道 Clip stop 方法 但是当我将它放在 key events 中时它似乎不起作用 它只会导致错误 好吧 我知道为什么会导致错误 因为我要求它基本上停止几行之后才存在的剪辑 但是使用相同的逻辑或接近它 如果可能 我如何重新编码 以
  • Nullable Bool 的编译器错误

    bool ispurchased null var pospurcahsed ispurchased 1 2 它产生异常 无法隐式转换类型 bool 布尔 明确的 存在转换 您是否缺少演员表 我在这里做错了什么 感谢您的支持和考虑 这是不允
  • 如何一次性删除文件和应用程序数据容器值?

    我的应用程序中有一个重置功能 可以将应用程序恢复到默认状态 因为我需要删除我创建的四个文件并删除我在ApplicationDataContainer 这就是我删除文件的方法 try StorageFile file await localf
  • 在 swift 5 中隐藏或禁用 uidocumentinteractioncontroller 的共享按钮

    在我的应用程序中 我使用 QuickLook 框架来查看文档文件 例如 pdf ppt doc 等 但出于隐私考虑 我不希望用户可以与其他人共享此文档 所以请让我知道如何禁用 隐藏共享按钮以及复制粘贴选项 我知道这个问题可以被问很多次并尝试