使用UIWebView加载本地数据或资源有如下三种方式:
1,使用
loadHTMLString 方法加载HTML内容
2,使用
loadRequest 方法加载本地资源(也可用于加载服务器资源)
3,先将内容保存成
NSData 数据,再使用
loadData 方法加载
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import
UIKit
class
ViewController
:
UIViewController
{
@IBOutlet
var
webview:
UIWebView
!
@IBOutlet
var
loadtype:
UISegmentedControl
!
override
func
viewDidLoad() {
super
.viewDidLoad()
//默认选中分段控件的第一项
loadtype.selectedSegmentIndex = 0
typeChanged(loadtype)
}
@IBAction
func
typeChanged(sender:
UISegmentedControl
)
{
let
index = sender.selectedSegmentIndex
print
(index)
switch
index
{
case
0:
//在 UIWebView 中显示 HTML 内容
webview.loadHTMLString(html,baseURL:
nil
)
case
1:
//在 UIWebView 中显示 PDF
let
path =
NSBundle
.mainBundle().pathForResource(
"test1"
, ofType:
"pdf"
)
let
urlStr =
NSURL
.fileURLWithPath(path!);
print
(urlStr)
webview.loadRequest(
NSURLRequest
(
URL
:urlStr));
case
2:
//在 UIWebView 中显示 PDF, 但是是通过 loadData 方式加载
let
path =
NSBundle
.mainBundle().pathForResource(
"test1"
, ofType:
"pdf"
)
let
urlStr =
NSURL
.fileURLWithPath(path!);
let
data =
NSData
(contentsOfURL:urlStr);
webview.loadData(data!,
MIMEType
:
"application/pdf"
,
textEncodingName:
"utf-8"
,baseURL:
NSURL
());
default
:
print
(
"是不是出错了?"
)
}
}
}
- class ViewController: UIViewController,UIWebViewDelegate { //遵守代理协议
-
- override func viewDidLoad() {
- super.viewDidLoad()
- //调用
- addwenview()
- }
-
- //加载网页到view的方法
- func addwenview() {
- let webview = UIWebView(frame:UIScreen.mainScreen().bounds )
- let Requst = NSURLRequest(URL: NSURL(string: "https://www.baidu.com")!)
- view.addSubview(webview)
- webview.loadRequest(Requst)
- webview.delegate = self //设置代理为本控制器
- }
-
- func webViewDidStartLoad(webView: UIWebView) {
- //连接网络时,显示系统自带的联网小菊花
- print("开始加载调用")
- UIApplication.sharedApplication().networkActivityIndicatorVisible = true
-
- }
-
- func webViewDidFinishLoad(webView: UIWebView) {
- print("加载完成调用")
- //加载完成关闭联网小菊花
- UIApplication.sharedApplication().networkActivityIndicatorVisible = false
- }
-
- func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
- print("加载失败调用")
- //加载失败了,我们可以创建一个按钮来重新加载,来重新调用 addwenview()方法
- //或者提醒用户检查联网状态
- //或者直接跳转到系统网络设置
- //或者坐一些其它处理
-
- }
-
- }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
import
UIKit
class
ViewController
:
UIViewController
{
@IBOutlet
var
webview:
UIWebView
!
@IBOutlet
var
loadtype:
UISegmentedControl
!
override
func
viewDidLoad() {
super
.viewDidLoad()
//默认选中分段控件的第一项
loadtype.selectedSegmentIndex = 0
typeChanged(loadtype)
}
@IBAction
func
typeChanged(sender:
UISegmentedControl
)
{
let
index = sender.selectedSegmentIndex
print
(index)
switch
index
{
case
0:
//在 UIWebView 中显示 HTML 内容
webview.loadHTMLString(html,baseURL:
nil
)
case
1:
//在 UIWebView 中显示 PDF
let
path =
NSBundle
.mainBundle().pathForResource(
"test1"
, ofType:
"pdf"
)
let
urlStr =
NSURL
.fileURLWithPath(path!);
print
(urlStr)
webview.loadRequest(
NSURLRequest
(
URL
:urlStr));
case
2:
//在 UIWebView 中显示 PDF, 但是是通过 loadData 方式加载
let
path =
NSBundle
.mainBundle().pathForResource(
"test1"
, ofType:
"pdf"
)
let
urlStr =
NSURL
.fileURLWithPath(path!);
let
data =
NSData
(contentsOfURL:urlStr);
webview.loadData(data!,
MIMEType
:
"application/pdf"
,
textEncodingName:
"utf-8"
,baseURL:
NSURL
());
default
:
print
(
"是不是出错了?"
)
}
}
}
|
如果出现类似错误: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
原因:在 iOS9中,在网络通话中ATS强制采用最佳实践,包括使用HTTPS.
解决办法: 右击 Info.plist 文件 -> Open As > Source Code
然后在最后的</dict>
之前添加如下代码即可:
- <key>NSAppTransportSecurity</key>
- <dict>
- <key>NSAllowsArbitraryLoads</key>
- <true/>
- </dict>