在 iOS 9 中遇到 WKWebview 和 UIWebView 问题
Having trouble with WKWebview and UIWebView in iOS 9
我对此感到非常沮丧,希望遇到过类似问题的任何人都能提供帮助。当前项目使用 Swift 2、iOS9 和 XCode 7.2。我有 ViewConroller 并尝试添加 UIWebView 或 WKWebview 作为子视图,但是,UIWebView 使应用程序崩溃,而我的 WKWebview 未加载 URL,并且 none 的 WKNavigationDelegate 方法被调用。
- 首先尝试使用 UIWebView,应用程序在 UIWebView 使用框架初始化的那一行崩溃,错误 'EXC_BAD_ACCESS'。如果我在 nib 中添加 webview,则在尝试以相同的错误呈现此 viewcrontroller 时整个应用程序崩溃。
``
import UIKit
import WebKit
class TestViewController: UIViewController, UIWebViewDelegate {
@IBOutlet weak var placeholderView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let webV:UIWebView = UIWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height))
webV.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")))
webV.delegate = self;
self.view.addSubview(webV)
}
}
``
- 改为使用 WKWebview,这解决了崩溃问题,但是,它只显示空白视图,并且 none 的 WKNavigationDelegate 方法被调用
``
import UIKit
import WebKit
class TestViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var placeholderView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let preferences = WKPreferences()
preferences.javaScriptEnabled = false
let webcon = WKWebViewConfiguration()
webcon.preferences = preferences
let webView: WKWebView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon)
webView.navigationDelegate = self
let url = NSURL(string: "https://www.google.com")!
placeholderView.addSubview(webView)
placeholderView.bringSubviewToFront(webView)
webView.loadRequest(NSURLRequest(URL: url))
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
NSLog("Webview started Loading")
}
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
NSLog("%@", navigationAction.request.URL!)
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("\nWebview did finish load \(webView.request)", terminator: "")
}
}
``
我已经将 WebKit 导入到框架工作中,添加的应用程序允许任意加载到我的 info.plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
UIWebView
崩溃的原因几乎可以肯定是因为 delegate
设置了一个不存在的对象。
我猜 WKWebView
委托方法没有被调用是因为你没有设置 navigationDelegate
属性 (或者你设置了,但是你设置它的对象已被释放。)
嗯,尝试更改您的 webView 声明.. 首先在您的 class 中通过 var webView: WKWebView
声明您的 webView(不要使用 let
),然后将 self.webView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon)
在 viewDidLoad()
我对此感到非常沮丧,希望遇到过类似问题的任何人都能提供帮助。当前项目使用 Swift 2、iOS9 和 XCode 7.2。我有 ViewConroller 并尝试添加 UIWebView 或 WKWebview 作为子视图,但是,UIWebView 使应用程序崩溃,而我的 WKWebview 未加载 URL,并且 none 的 WKNavigationDelegate 方法被调用。
- 首先尝试使用 UIWebView,应用程序在 UIWebView 使用框架初始化的那一行崩溃,错误 'EXC_BAD_ACCESS'。如果我在 nib 中添加 webview,则在尝试以相同的错误呈现此 viewcrontroller 时整个应用程序崩溃。
``
import UIKit
import WebKit
class TestViewController: UIViewController, UIWebViewDelegate {
@IBOutlet weak var placeholderView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let webV:UIWebView = UIWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height))
webV.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")))
webV.delegate = self;
self.view.addSubview(webV)
}
}
``
- 改为使用 WKWebview,这解决了崩溃问题,但是,它只显示空白视图,并且 none 的 WKNavigationDelegate 方法被调用
``
import UIKit
import WebKit
class TestViewController: UIViewController, WKNavigationDelegate {
@IBOutlet weak var placeholderView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let preferences = WKPreferences()
preferences.javaScriptEnabled = false
let webcon = WKWebViewConfiguration()
webcon.preferences = preferences
let webView: WKWebView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon)
webView.navigationDelegate = self
let url = NSURL(string: "https://www.google.com")!
placeholderView.addSubview(webView)
placeholderView.bringSubviewToFront(webView)
webView.loadRequest(NSURLRequest(URL: url))
}
func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
NSLog("Webview started Loading")
}
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {
NSLog("%@", navigationAction.request.URL!)
}
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
print("\nWebview did finish load \(webView.request)", terminator: "")
}
}
``
我已经将 WebKit 导入到框架工作中,添加的应用程序允许任意加载到我的 info.plist。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
UIWebView
崩溃的原因几乎可以肯定是因为 delegate
设置了一个不存在的对象。
我猜 WKWebView
委托方法没有被调用是因为你没有设置 navigationDelegate
属性 (或者你设置了,但是你设置它的对象已被释放。)
嗯,尝试更改您的 webView 声明.. 首先在您的 class 中通过 var webView: WKWebView
声明您的 webView(不要使用 let
),然后将 self.webView = WKWebView(frame: CGRectMake(0, 0, placeholderView.bounds.width, placeholderView.bounds.height), configuration: webcon)
在 viewDidLoad()