【问题标题】:Cannot access a file in a bundle无法访问捆绑包中的文件
【发布时间】:2017-10-18 20:47:39
【问题描述】:

我在获取包中文件的路径/url 时遇到问题。这是我使用的代码

@IBOutlet weak var testWebView: UIWebView!

private func setText() {

if let path = Bundle.main.path(forResource: "theory", ofType: "pdf") {
    let url = NSURL(fileURLWithPath: path)
    let request = NSURLRequest(url: url as URL)
    testWebView.loadRequest(request as URLRequest)
 }
}
override func viewDidLoad() {
   super.viewDidLoad()
  // setText()
}

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
setText()
}

文件 theory.pdf 在主包中(没有子文件夹等) 我尝试了这里讨论的许多方法,例如使用创建组/创建文件夹引用进行复制等 - 没有任何帮助。 webView 在 StoryBoard 中设置。

【问题讨论】:

  • 文件的 Target Membership 设置了吗?拼写是否正确(大小写很重要)?顺便说一句,使用Bundle.main.url(forResource:withExtension:)、(URL) 和URLRequest 来避免丑陋的桥接。
  • 要使用 WKWebView 打开本地文件资源,您应该使用 loadfileurl developer.apple.com/documentation/webkit/wkwebview/…
  • 什么是目标成员集...?拼写完全正确(只是复制粘贴了名称。Bundle.main.url 也不行。
  • stackoverflow 中的方法 - 不起作用,可能是同样的原因,bundle.main.url 返回 nil。 wrt WKWebView - 我没有使用它 :-( 我的是 UIKit 的简单 UIWebView。

标签: ios swift pdf bundle


【解决方案1】:

如果您的目标是显示 PDF,我强烈建议您使用 UIDocumentInteractionController

class ViewController: UIViewController {

    private var documentInteractionController: UIDocumentInteractionController?

    private func setText() {
        if let path = Bundle.main.path(forResource: "theory", ofType: "pdf") {
            let url = URL(fileURLWithPath: path)
            let controller = UIDocumentInteractionController(url: url)
            controller.delegate = self
            controller.presentPreview(animated: true)
            documentInteractionController = controller
        }
    }

    override func viewDidAppear(_ animated: Bool) {
         super.viewDidAppear(animated)
         setText()
    }

}

还需要实现UIDocumentInteractionControllerDelegate:

extension ViewController: UIDocumentInteractionControllerDelegate {

    func documentInteractionControllerViewControllerForPreview(_ controller: UIDocumentInteractionController) -> UIViewController {
         return self
    }

}

【讨论】:

  • 这实际上会打开另一个应用程序。我建议使用 QLPreviewController 或 PDFKit (iOS 11+)
  • 谢谢,这样会更好,但我的问题是路径从 Bundle.main.url/path 接收 nil。我无法通过那行代码。 :-(
  • iOS 区分大小写,因此文件必须完全匹配 theory.pdf。将文件添加到项目后,您需要确保在打包捆绑包时将其复制到捆绑包上。您可以通过转到目标 Build Phases > Copy Bundle Resources 来验证这一点。该文件必须在列表中。如果不存在,您可以使用 + 或通过从 Project Navigator 中选择它并在 Target Membership 上检查它来添加它。
【解决方案2】:

谢谢大家。我解决了这个问题。我没有将 PDF 拖放到包中,而是右键单击 Project Navigator 并选择添加文件到... 此后在上传的文件上再次右键单击并选择添加...。 最后它奏效了。再次感谢。现在我将试验你的建议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2018-02-19
    • 2014-11-03
    相关资源
    最近更新 更多