WKWebView委托问题(使用Swift的Xcode 7.3)

时间:2016-05-06 17:56:16

标签: ios swift delegates wkwebview

我正在创建一个基本上是webview的应用程序。它使用不能在常规webapp中使用的自定义专有字体,因此也就是app包装器。

它适用于大多数用途,但我想检查URL请求是否正确加载,以发送未找到的页面'如果给出错误的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()

}

}

非常感谢您的建议。

2 个答案:

答案 0 :(得分:1)

据我所知,您还无法在Interface Builder中创建WKWebView。我认为必须以编程方式创建它。您是否在故事板中使用了UIWebView并尝试将插座设置为WKWebView?如果是这样,那就是它崩溃的原因。它们完全是不同的对象。

如果您必须在Storyboard中构建它,可以尝试使用UIWebView。但是我不知道为什么WKWebView在以编程方式创建时会有任何不同的行为(首先它不能在IB中创建)。

答案 1 :(得分:0)

麦克科尔上面的回答解释了我的问题的核心。但是还有进一步调查的FYI,我发现这个question看了自定义字体以及在WKWebViews中使用它们的困难