顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [Xcode][Swift3] 使用 WebView 顯示網頁內容
時間 2017-03-13 Mon. 15:58:07


延續上一篇 [Xcode][Swift3] 點擊列表開啟並傳送資料至新的頁面 - KnucklesNote板 - Disp BBS
開了一個空白的 View Controller
並傳送一個網址過來

使用 Web View 將網頁顯示出來

從右下的 Object library 拉一個 Web View 到 View Controller
[圖]


先將 Web View 的大小調整為跟頁面一樣大,
再點右下的「Add New Constraints」按鈕,設定上下左右的間距為 0
然後點「Add 4 Constraints」
[圖]


發現 Navigation Bar 的顏色變深了
因為當 Web View 加進一個有 Navigation Bar 的頁面時,
Web View 會自動在上方加上 Navigation Bar 的間距,
而 Navigation Bar 有設透明度所以顯示了 Web View 的背景色黑色
只要將 Web View 的背景色改為白色即可
[圖]




使用 Assistant editor 自動加上 IBOutlet

要加上 IBOutlet,除了先手動加上程式碼
再到 storyboard 的連結檢視器拉到對應的元件外
也可以使用 Assistant editor 快速產生

先點一下 Web View 然後點右上角的 Assistant editor 按鈕 (兩個圈圈那個)
在 storyboard 的右邊就會顯示元件對應的類別程式碼 TextViewController
若位置太小可以再按最右邊的 Utilities 按鈕先隱藏右邊的 Utilities 視窗
[圖]


按著 Ctrl 將 Web View 拉到放成員變數的地方
[圖]


輸入名稱後按 Connect
[圖]


自動產生程式碼並設定好與 storyboard 元件的連結了
[圖]


要恢復本來的視窗,點一下 Standard editor 與 Utilities 即可
[圖]



編輯 TextViewController.swift

修改成員函數 viewDidLoad()
將之前加的 print(self.urlString) 改成
        let url = URL(string: self.urlString)
        let request = URLRequest(url: url!)
        self.webView.loadRequest(request)
因為 url 取得的是一個可能為 nil 的 optional 變數
所以傳入 URLRequest() 前要在後面加個驚嘆號
代表確定這個變數不會是 nil 值

或者改用 if 取得一個不會是 nil 的變數也可以
        if let url = URL(string: self.urlString) {
            let request = URLRequest(url: url)
            self.webView.loadRequest(request)
        }



執行看看,點一下文章後,可以載入網頁內容了
[圖]



在載入網頁內容時顯示載入中圖示

如果想要在 webView 存取網路時在左上角顯示載入中的圖示
[圖]


要先加上 webView 的 delegate 函數

delegate 函數是一種將成員函數委任給另一個類別來寫的函數
例如 webView 載入檔案時會呼叫自己的 delegate 函數,
但函數內容是寫在別的類別 TextViewController 裡

修改 class TextViewController: UIViewController { 為
class TextViewController: UIViewController, UIWebViewDelegate {
讓 TextViewController 繼承 UIWebViewDelegate

在成員函數 viewDidLoad() 中加上
        self.webView.delegate = self
讓 WebView 的成員變數 delegate 指向類別 TextViewController

加上兩個 webView 的 delegate 函數
    func webViewDidStartLoad(_ webView: UIWebView) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = true
    }
    func webViewDidFinishLoad(_ webView: UIWebView) {
        UIApplication.shared.isNetworkActivityIndicatorVisible = false
    }

當 webView 開始下載資料時,就會執行 webViewDidStartLoad()
下載完成時,就會執行 webViewFinishLoad()

在這兩個函數裡分別使用 UIApplication.shared.isNetworkActivityIndicatorVisible
來開啟及關閉載入中的圖示


加上瀏覽功能的按鈕

例如想要在右上角加上重新整理的按鈕

若 View Controller 裡沒有 Navigation Item 的話,要拉一個進來
[圖]


在 Navigation Item 的屬性檢視器,輸入 Title 為「閱讀文章」
[圖]


拉一個 Bar Button Item 到 Navigation Item 的右邊
[圖]


點一下按鈕,在屬性檢視器將 System Item 改為 Refresh
[圖]


打開 Assistant editor 按著 Ctrl 將按鈕拉到程式碼的類別裡
[圖]


跳出的選單,Connection 改為 Action,名稱輸入 refresh,點 Connect
[圖]


自動產生了一個點擊按鈕後會執行的成員函數 refresh(_:)
[圖]


切換回 Standard editor,修改成員函數 refresh(_:) 為
    @IBAction func refresh(_ sender: Any) {
        self.webView.reload()
    }

執行看看,閱讀文章時點右上角的 refresh 按鈕重新整理網頁


一樣的方法再加一個回上頁的按鈕
拉一個 Bar Buttom Item 到 refresh 按鈕的左邊
在屬性檢視器輸入 Title 為「回上頁」
取消勾選「Enabled」,一開始先顯示為灰色的不可點擊狀態
[圖]



開啟 Assistant editor
對回上頁按鈕按著 ctrl 拉一個 @IBOulet 到程式碼中成員變數的地方
名稱輸入 goBackBtn
    @IBOutlet weak var goBackBtn: UIBarButtonItem!

再對回上頁按鈕按著 ctrl 拉一個 @IBAction 到程式碼中
名稱輸入 goBack

修改產生的成員函數 goBack(_:) 為
    @IBAction func goBack(_ sender: Any) {
        self.webView.goBack()
    }

切換回 standard editor

修改 webView 的 delegate 函數 webViewDidFinishLoad(),加上
        if self.webView.canGoBack {
            self.goBackBtn.isEnabled = true
        } else {
            self.goBackBtn.isEnabled = false
        }


執行看看,進閱讀文章後,回上頁按鈕是灰色的不能點
在網頁中點擊超連結後,就會變成藍色的可以點
點了後會回到上一頁


參考
http://sourcefreeze.com/uiwebview-example-using-swift-in-ios/



--
※ 作者: Knuckles 時間: 2017-03-13 15:58:07
※ 編輯: Knuckles 時間: 2017-03-19 11:43:25
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 1972 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇
看板名稱: 確定(Enter) 取消(Esc) 搜尋(Space)
查詢帳號: 確定(Enter) 取消(Esc) 搜尋(Space)
搜尋: m)m文 b)進板 c)未分類 a)作者 /)標題 q)取消?[q]

搜尋 送出(Enter) 取消(Esc)

回覆文章至: f)看板 m)作者信箱 b)兩者皆是 q)取消?[f]
要引用原文嗎? y)引用原文 n)不引用 a)全部回覆 r)複製原文 q)取消?[y]
轉錄本文章於看板: 1)使用連結 2)使用複製 q)取消 ?[1]
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
轉寄至站內信箱於使用者: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc)
修改文章標題為: 確定(Enter) 取消(Esc) 全部(a)

確定要刪除這篇文章?(可按大U救回) 確定(Enter) 取消(Esc)

刪除理由:

確定(Enter) 取消(Esc)
加到這個分類: 確定(Enter) 下一層(→) 回上層(←) 取消(Esc)
你覺得這篇文章: 1)真讚 2)真瞎 q)取消?[1] (再選一次即可收回)
你覺得這篇文章: 1)值得推薦 2)表示反對 3)單純註解 q)取消?[3]
guest
預覽(Enter) 取消(Esc)
上傳圖片
按ctrl+Enter可輸入下一行。
guest
確定要送出? 確定(Enter) 取消(Esc) 繼續(e)
搜尋: 送出(Enter) 取消(Esc)

▏▎▍▌▋▊▉ 請按任意鍵繼續