WKWebView 委托问题(Xcode 7.3 使用 Swift)
WKWebView delegate issue (Xcode 7.3 using Swift)
我正在创建一个本质上是网络视图的应用程序。它使用不能在常规网络应用程序中使用的自定义专有字体,因此是应用程序包装器。
它在大多数情况下工作正常,但我想检查 URL 请求是否正确加载,发送 'page not found' 消息或一些类似的消息,当给出错误的 URL 或URL 加载失败。为此,我认为我需要一名代表。
问题:每次我尝试创建委托(尽管尝试了我在示例中看到的几种方法)时,应用程序都会在加载时崩溃。
(顺便说一句:如果我以编程方式而不是在情节提要中创建 webview,则不会加载自定义字体,就我而言,这是主要要求的失败。如果您有解决方案)
代码:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
@IBOutlet var containerView: UIView!
var screenEdgeRecognizer: UIScreenEdgePanGestureRecognizer!
//var currentRadius:CGFloat = 0.0
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
screenEdgeRecognizer = UIScreenEdgePanGestureRecognizer(target: self,
action: #selector(ViewController.goBack(_:)))
screenEdgeRecognizer.edges = .Left
view.addGestureRecognizer(screenEdgeRecognizer)
// *** This line commented out to prevent app from crashing!
//self.webView.navigationDelegate = self
webView.hidden = false;
// this allows the UIWebView box to your background color seamlessly.
webView.opaque = false;
// Do any additional setup after loading the view, typically from a nib.
let url = NSURL (string: "http://localhost/web_app/mobile_login.php");
let requestObj = NSURLRequest(URL: url!);
//let localfilePath = NSBundle.mainBundle().URLForResource("home", withExtension: "html");
//let requestObj = NSURLRequest(URL: localfilePath!);
webView.loadRequest(requestObj);
//webView.allowsBackForwardNavigationGestures = true;
}
// **** This code I hope to use but I think requires a delegate in order to work
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
presentViewController(alert, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func preferredStatusBarStyle() -> UIStatusBarStyle {
//LightContent
return UIStatusBarStyle.LightContent
//Default
//return UIStatusBarStyle.Default
}
func goBack(sender: UIScreenEdgePanGestureRecognizer) {
//
self.webView.goBack()
}
}
非常感谢您的建议。
据我所知,您还不能在 Interface Builder 中创建 WKWebView
。我相信它必须以编程方式创建。您是否在情节提要中使用 UIWebView
并尝试将插座设置为 WKWebView
?如果是这样,这就是它崩溃的原因。它们完全是不同的对象。
如果必须在 Storyboard 中构建,可以尝试使用 UIWebView。但我不知道为什么 WKWebView
在以编程方式创建时会有任何不同的行为(首先它不能在 IB 中创建)。
上面 Mike Cole 的回答直击了我的问题所在。但仅供参考,在进一步调查中,我发现了这个 question,它查看自定义字体以及将它们与 WKWebViews
一起使用的困难
我正在创建一个本质上是网络视图的应用程序。它使用不能在常规网络应用程序中使用的自定义专有字体,因此是应用程序包装器。
它在大多数情况下工作正常,但我想检查 URL 请求是否正确加载,发送 'page not found' 消息或一些类似的消息,当给出错误的 URL 或URL 加载失败。为此,我认为我需要一名代表。
问题:每次我尝试创建委托(尽管尝试了我在示例中看到的几种方法)时,应用程序都会在加载时崩溃。
(顺便说一句:如果我以编程方式而不是在情节提要中创建 webview,则不会加载自定义字体,就我而言,这是主要要求的失败。如果您有解决方案)
代码:
import UIKit
import WebKit
class ViewController: UIViewController, WKNavigationDelegate {
@IBOutlet var containerView: UIView!
var screenEdgeRecognizer: UIScreenEdgePanGestureRecognizer!
//var currentRadius:CGFloat = 0.0
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
screenEdgeRecognizer = UIScreenEdgePanGestureRecognizer(target: self,
action: #selector(ViewController.goBack(_:)))
screenEdgeRecognizer.edges = .Left
view.addGestureRecognizer(screenEdgeRecognizer)
// *** This line commented out to prevent app from crashing!
//self.webView.navigationDelegate = self
webView.hidden = false;
// this allows the UIWebView box to your background color seamlessly.
webView.opaque = false;
// Do any additional setup after loading the view, typically from a nib.
let url = NSURL (string: "http://localhost/web_app/mobile_login.php");
let requestObj = NSURLRequest(URL: url!);
//let localfilePath = NSBundle.mainBundle().URLForResource("home", withExtension: "html");
//let requestObj = NSURLRequest(URL: localfilePath!);
webView.loadRequest(requestObj);
//webView.allowsBackForwardNavigationGestures = true;
}
// **** This code I hope to use but I think requires a delegate in order to work
func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: nil))
presentViewController(alert, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func preferredStatusBarStyle() -> UIStatusBarStyle {
//LightContent
return UIStatusBarStyle.LightContent
//Default
//return UIStatusBarStyle.Default
}
func goBack(sender: UIScreenEdgePanGestureRecognizer) {
//
self.webView.goBack()
}
}
非常感谢您的建议。
据我所知,您还不能在 Interface Builder 中创建 WKWebView
。我相信它必须以编程方式创建。您是否在情节提要中使用 UIWebView
并尝试将插座设置为 WKWebView
?如果是这样,这就是它崩溃的原因。它们完全是不同的对象。
如果必须在 Storyboard 中构建,可以尝试使用 UIWebView。但我不知道为什么 WKWebView
在以编程方式创建时会有任何不同的行为(首先它不能在 IB 中创建)。
上面 Mike Cole 的回答直击了我的问题所在。但仅供参考,在进一步调查中,我发现了这个 question,它查看自定义字体以及将它们与 WKWebViews
一起使用的困难