使用iOS8 Swift XCode 6通过uiwebview将新样式表注入网站

使用iOS8 Swift XCode 6通过uiwebview将新样式表注入网站,swift,uiwebview,ios8,xcode6,Swift,Uiwebview,Ios8,Xcode6,我在这里看到了一些仅使用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 = NSURLReque

我在这里看到了一些仅使用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将样式附加到正在加载的网页:

  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)

使用现在首选的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)
}
要使文件可用,请执行以下操作:

  • 单击您的项目
  • 点击你的目标
  • 选择构建阶段
  • 展开复制包资源
  • 单击“+”并选择您的文件
  • 还要确保控制器实现WKNavigationDelegate:

    class ViewController: UIViewController, WKNavigationDelegate 
    

    嘿,谢谢你!我也有同样的想法。是否需要向第二个CSS脚本添加任何内容以覆盖另一个CSS脚本?喜欢推杆!每次重写命令后都很重要吗?再次感谢!而且,这似乎对我不起作用。我无法让
    website.delegate=self
    行正常工作,但这一部分重要吗?@kragalon在css覆盖方面:由于css是分层的,因此只要将新样式加载到网站样式之下,就会覆盖网站的样式。下面我的意思是在其他css样式被调用之后调用last。但是,如果站点的样式使用!对于任何重要的脚本元素,您也需要添加!覆盖该元素的重要脚本。@Kragalon您能否就涉及网站代表的其他问题提供更多详细信息?你在代码中的什么地方设置它?我知道这是前一段时间问过的,但是要设置website.delegate=self,你需要在主类中传递UIWebViewDelegate。