SWIFT - 加载本地CSS文件

时间:2017-06-10 18:39:52

标签: ios swift uiwebview

我正在尝试将一些本地css添加到我的webview中,但似乎我的应用程序中的css文件存在问题:

enter image description here

当我尝试从本地css文件加载css时没有任何反应,但当我用在线css文件替换'%@'时它工作正常。

感谢您的帮助。

import UIKit

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var webview: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        webview.delegate = self

        let html: String! = "<html><head></head><body><div id=\"postcontent\"><h1>Hello</h1></div></body></html>"

        webview.loadHTMLString(html, baseURL: nil)
    }

    func webViewDidFinishLoad(_ webView: UIWebView){
        let path = Bundle.main.path(forResource: "styles", ofType: "css")

        let javaScriptStr: NSString = "var link = document.createElement('link'); link.href = '%@'; link.rel = 'stylesheet'; document.head.appendChild(link)"
        let javaScripthPath = NSString(format: javaScriptStr, path!)
        webview.stringByEvaluatingJavaScript(from: javaScripthPath as String)
        print(javaScripthPath)
    }
}

1 个答案:

答案 0 :(得分:1)

您的HTML文件是从字符串加载的,因此它被加载到无法访问文件系统上的文件的Web视图中(可能是由于浏览器实现的同源策略)。它只能访问类似地通过loadHTMLString注入的资源。

如果要使用本地CSS,请从文件而不是字符串加载HTML。如果它位于同一目录中,这将为Web视图提供对CSS的访问。

这是一个演示,首先,HTML现在是一个文件。

enter image description here

然后,您的代码可能如下所示:

class ViewController: UIViewController, UIWebViewDelegate {

    @IBOutlet weak var webview: UIWebView!
    override func viewDidLoad() {
        super.viewDidLoad()
        webview.delegate = self

        let path = Bundle.main.path(forResource: "app", ofType: "html")!
        let url = URL(fileURLWithPath: path)
        let request = URLRequest(url: url)

        webview.loadRequest(request)
    }

    func webViewDidFinishLoad(_ webView: UIWebView){
        let path = Bundle.main.path(forResource: "styles", ofType: "css")!

        let javaScriptStr = "var link = document.createElement('link'); link.href = '\(path)'; link.rel = 'stylesheet'; document.head.appendChild(link)"
        webview.stringByEvaluatingJavaScript(from: javaScriptStr)
    }
}