使用iOS8 Swift XCode 6通过uiwebview将新样式表注入网站
我在这里看到了一些仅使用Objective-C的选项,但在XCode 6中使用Swift iOS8时遇到了问题。我正在使用uiwebview加载网站。举个例子,假设它是google.com使用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
@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)
}
要使文件可用,请执行以下操作:
class ViewController: UIViewController, WKNavigationDelegate
嘿,谢谢你!我也有同样的想法。是否需要向第二个CSS脚本添加任何内容以覆盖另一个CSS脚本?喜欢推杆!每次重写命令后都很重要吗?再次感谢!而且,这似乎对我不起作用。我无法让
website.delegate=self
行正常工作,但这一部分重要吗?@kragalon在css覆盖方面:由于css是分层的,因此只要将新样式加载到网站样式之下,就会覆盖网站的样式。下面我的意思是在其他css样式被调用之后调用last。但是,如果站点的样式使用!对于任何重要的脚本元素,您也需要添加!覆盖该元素的重要脚本。@Kragalon您能否就涉及网站代表的其他问题提供更多详细信息?你在代码中的什么地方设置它?我知道这是前一段时间问过的,但是要设置website.delegate=self,你需要在主类中传递UIWebViewDelegate。