在 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 的共享按钮 的相关文章

  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu
  • 使用 AVAssetExportSession 导出延时会导致黑色视频

    我需要能够合并使用 iOS 上的相机应用程序中的延时拍摄功能拍摄的视频并导出为单个视频 但是 即使我尝试将单个未更改的延时视频导出到照片库 它也会保存为全黑视频 具有正确的持续时间 以下是我编写的示例代码 用于导出单个未更改的视频 其中大部
  • UIAlertController 显示延迟

    我在我的应用程序上遇到了 UIAlertController 问题 现已迁移到 iOS8 其中包含日期选择器 下面是代码 UIAlertController AlertView UIAlertController alertControll
  • 有没有办法更改 UITabBar 或 UITabBarItem 中的文本位置?

    这是我打算放在屏幕上的自定义选项卡栏 然而 我的搭档希望文字稍微向上一些 我怎样才能这样做呢 为什么不为视图控制器设置一个空的标题属性 并将标题添加到选项卡的自定义图像中 UPDATE 为了回答的完整性 来自评论和ios标签栏在没有图像时将
  • 使用 ARKit 加载的 3D 文件有大小限制吗?

    我正在使用 ARKit 开发一个增强现实应用程序 我们需要在其中加载一组建筑物的 3D 模型 我计划是检测水平面并将物体放置在那里 3D 模型或检测到的平面尺寸有尺寸限制吗 如果您谈论的是文件的物理大小 我应该说每个模型的多边形数量比以 M
  • 如何在不使用 Cocos2D 的情况下将声音实现到现有应用程序中

    例如 iOS SDK下载页面上有示例代码 我正在使用计算器应用程序 iPhoneUnitTests 我想知道是否可以轻松地向已构建的应用程序上的按钮添加声音 播放短声音 例如按钮声音 实际上非常简单 这是一个简单的例子 您必须链接 Audi
  • 从 RemoteIO 录制到 AAC:数据正在写入,但文件无法播放

    我一直在尝试从 iPad 2 上的 iOS 5 中的 renderCallback 中直接从 RemoteIO 单元录制到 AAC 我看到了相互矛盾的信息 说这是不可能的 但这是可能的 在评论中 here http atastypixel
  • 如何更改故事板的初始视图控制器?

    我有2个视图控制器 我禁用了第一个视图控制器的初始视图控制器 并启用了第二个视图控制器 但是当启动项目时 初始视图控制器仍然是第一个视图控制器 我该怎么办 谢谢 点击第二个视图控制器 然后选择 Is initial View Control
  • 在制作自定义 iOS 键盘扩展时,如何创建一个与 Apple 原始退格键具有相同功能的按钮?

    我正在制作一个自定义键盘 其中有用于删除文本的删除按钮 其代码是 func addDelete deleteButton UIButton buttonWithType System as UIButton deleteButton set
  • 如何使用所有类型的 UTI 初始化 UIDocumentPickerViewController

    我想打开 UIDocumentPickerViewController 并且它应该允许用户选择所有类型的文件 我尝试在 UIDocumentPickerViewController init 方法中提及所有 UTI 但仍然找不到某些文件 如
  • 搜索栏与节标题视图重叠

    我将搜索栏放在 tableHeaderView 内 在 iphone 6 上一切正常 但在 iphone 5s 上我得到这个奇怪的结果 override func viewDidLoad super viewDidLoad tableVie
  • dyld:找不到符号:_kABPersonAddressCityKey XCODE 8 问题

    你好 我的代码在 xcode 中完美运行7 x x 当我更新我的 xcode 时 我遇到了这个问题 请给我解决方案 细节 dyld 未找到符号 kABPersonAddressCityKey 引用自 var containers Bundl
  • iOS 5 中的新错误:WebKit 丢弃了未捕获的异常

    我正在尝试加载一个UIWebView与 Facebook OAuth 授权 URL 我使用以下代码 当我的UIWebView加载 Facebook 登录页面 我输入我的凭据 然后按 登录 按钮 当我点击按钮时 我收到以下错误 WebKit
  • @interface 中的 Objective-c 特定 iOS 版本

    我正在尝试实现Apple Pay 并且我尝试实现两种方法 一种用于iOS10 一种用于iOS11 所以在我的实现中我有 void paymentAuthorizationViewController PKPaymentAuthorizati
  • 使用 CMake 在 iOS 中使用另一个 STATIC 库创建一个 STATIC 库

    我有一个 libfooi a 的集合 libfoo1 a libfoo2 a libfoo3 a 使用工厂 带有静态代码 有一个公共接口来创建 C 对象 使用 CMake 我选择其中之一 并创建一个链接它并添加所有内容的 libfooWra
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 是否可以使用 UITableViewStylePlain 禁用 UITableView 中的浮动标题?

    我正在使用一个UITableView布局内容 页面 我使用表视图的标题来布局某些图像等 如果它们不浮动而是保持静态 就像样式设置为时那样 我更喜欢它UITableViewStyleGrouped 其他则使用UITableViewStyleG
  • 将子视图控制器添加到当前视图控制器

    我正在尝试使用以下代码在代码中将子视图控制器添加到情节提要中的当前视图控制器 UIStoryboard storyboard UIStoryboard storyboardWithName Main bundle nil LogInTuto
  • UITableView 干扰状态栏

    我正在开发一个具有 UITableViewController 的应用程序 该应用程序显示值列表 如下所示 如何将表格向下移动 使其不会与状态栏冲突 看来我无法对这个场景施加任何限制 所以我不知所措 使用以下 3 个属性UIViewCont

随机推荐

  • 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 等 但出于隐私考虑 我不希望用户可以与其他人共享此文档 所以请让我知道如何禁用 隐藏共享按钮以及复制粘贴选项 我知道这个问题可以被问很多次并尝试