You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何移除QLPreviewController的编辑按钮?

移除QLPreviewController导航栏右上角编辑按钮的方法

以下是几种可行的实现方案,按可靠性排序:

方案一:子类化QLPreviewController,在视图加载完成后移除按钮

通过自定义QLPreviewController子类,在viewDidAppear方法中直接清空导航栏右侧按钮,或者过滤掉编辑按钮:

class CustomQLPreviewController: QLPreviewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 直接清空所有右侧按钮
        navigationItem.rightBarButtonItems = []
        
        // 若只想移除编辑按钮,可保留其他按钮:
        /*
        navigationItem.rightBarButtonItems = navigationItem.rightBarButtonItems?.filter {
            $0.title != "编辑"
        }
        */
    }
}

使用时直接实例化这个子类即可,该方法在大部分iOS版本中稳定有效。

方案二:自定义QLPreviewItem,禁用编辑权限

实现QLPreviewItem协议的自定义类,重写canEdit属性返回false,告诉QLPreviewController当前文件不可编辑:

class CustomPreviewItem: NSObject, QLPreviewItem {
    let previewItemURL: URL?
    let previewItemTitle: String?
    
    // 禁用编辑权限
    var canEdit: Bool { false }
    
    init(url: URL, title: String?) {
        self.previewItemURL = url
        self.previewItemTitle = title
        super.init()
    }
}

将此类的实例传入QLPreviewController的previewItems数组,部分iOS版本会自动隐藏编辑按钮。注意:该行为可能因系统版本差异有所变化,建议测试验证。

方案三:遍历导航栏子视图,隐藏编辑按钮(兜底方案)

如果前两种方法无效,可通过遍历导航栏子视图找到编辑按钮并隐藏。此方法依赖UI结构,可能随iOS版本更新失效,仅作为兜底:

class CustomQLPreviewController: QLPreviewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        navigationBar.subviews.forEach { subview in
            guard let button = subview as? UIButton else { return }
            if button.titleLabel?.text == "编辑" {
                button.isHidden = true
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者muchcool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 22:39:20