【问题标题】:Injecting a new stylesheet into a website via uiwebview using iOS8 Swift XCode 6使用 iOS8 Swift XCode 6 通过 uiwebview 将新样式表注入网站
【发布时间】:2015-02-10 14:33:30
【问题描述】:

我在这里看到了一些仅使用 Objective-C 的选项,但我在 XCode 6 中使用 Swift iOS8 执行此操作时遇到了问题。我正在使用 uiwebview 加载网站。例如,假设它的 google.com。

@IBOutlet var website: UIWebView!

var url = "http://www.google.com"

func loadUrl() {
    let requestURL = NSURL(string: url)
    let request = NSURLRequest(URL: requestURL!)
    website.loadRequest(request)
}

override func viewDidLoad() {
    super.viewDidLoad()
    website.delegate = self
    loadUrl()
}

func webViewDidFinishLoad(website: UIWebView) {
    var jsscript = "some script here"
    website.stringByEvaluatingJavaScriptFromString(jsscript)
}

使用 Swift,我如何将一个全新的样式表注入到网站中,以便我可以覆盖许多样式?

另外,我希望新样式表存在于我的应用程序目录之一中。最好的目录在哪里?在“支持文件?”下而且,我将如何在我的代码中调用该路径?

如果在应用样式之前网站不加载也很好。

【问题讨论】:

    标签: swift uiwebview ios8 xcode6


    【解决方案1】:

    所以,我想我至少找到了一种方法来完成将样式附加到使用 Swift 加载的网页:

      var loadStyles = "var script = 
      document.createElement('link');
      script.type = 'text/css';
      script.rel = 'stylesheet';
      script.href = 'http://fake-url/styles.css';
      document.getElementsByTagName('body')[0].appendChild(script);"
    
      website.stringByEvaluatingJavaScriptFromString(loadStyles)
    

    【讨论】:

    • 嘿,谢谢伙计!我有同样的想法。是否需要将任何内容添加到第二个 CSS 脚本以覆盖另一个?就像在每个被覆盖的命令之后加上 !important 一样?再次感谢!
    • 另外,这似乎对我不起作用。我无法让website.delegate = self 线工作,但这部分重要吗?
    • @kragalon 在 css 覆盖方面:由于 CSS 是分层的,只需将新样式加载到网站样式下方就应该覆盖网站的样式。下面我的意思是在调用其他 css 样式之后最后调用它。但是,如果网站的样式对其任何元素使用 !important 脚本,您也需要添加 !important 脚本来覆盖该元素。
    • @Kragalon 您能否就涉及网站代表的其他问题提供更多详细信息?您在代码中的哪个位置设置它?
    • 我知道这是不久前被问到的,但是要设置 website.delegate = self,您需要在主类中传递 UIWebViewDelegate。
    【解决方案2】:

    使用现在首选的 WKWebView,您可以将外部 css 文件(例如 tweaks.css)放在项目的根目录或子文件夹中,然后您可以将其注入到您的页面中,如下所示:

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        guard let path = Bundle.main.path(forResource: "tweaks", ofType: "css") else { return }
        let css = try! String(contentsOfFile: path).replacingOccurrences(of: "\\n", with: "", options: .regularExpression)
        let js = "var style = document.createElement('style'); style.innerHTML = '\(css)'; document.head.appendChild(style);"
        webView.evaluateJavaScript(js)
    }
    

    要使文件可用:

    1. 点击您的项目
    2. 点击你的目标
    3. 选择构建阶段
    4. 扩展复制捆绑资源
    5. 点击“+”并选择您的文件。

    还要确保你的控制器实现了 WKNavigationDelegate:

    class ViewController: UIViewController, WKNavigationDelegate 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多