顯示廣告
隱藏 ✕
看板 KnucklesNote
作者 Knuckles (站長 那克斯)
標題 [Xcode][Swift3] 使用協定(Protocol)建立委派(Delegate)函數
時間 2017-04-28 Fri. 19:20:23


委派函數(delegate function)
是一種會在別的類別裡呼叫,但函數內容是寫在自己類別裡的函數

例如我們要做一個登入頁的功能
[圖]

在主頁面 MainViewController 有個成員函數 didLogin()
可以將登入按鈕的文字改為登出

在主頁面點了登入按鈕後,會跳至登入頁 LoginViewController

在登入頁中,輸入帳號密碼送出後
希望能執行主頁面的 didLogin()
將主頁面的登入鈕改成登出鈕


以下為實作的步驟

修改登入頁的 LoginViewController.swift

在 class LoginViewController: UIViewController { 這行前面加上
protocol LoginViewControllerDelegate {
    func didLogin(userId: Int, userName: String)
}
建立一個協定(Protocol),名稱為 LoginViewControllerDelegate
協定內容為,需要建立一個委派函數 didLogin()


在類別加上一個成員函數
    var delegate: LoginViewControllerDelegate?
用來代表會用到這個協定的類別


在完成登入,取得使用者ID與名稱後,執行委派函數
並傳入取得的ID與名稱
        self.delegate?.didLogin(userId: userId, userName: userName)


修改主頁面的 MainViewController.swift

將 class MainViewController: UIViewController { 改為
class MainViewController: UIViewController, LoginViewControllerDelegate {
代表要使用協定 LoginViewControllerDelegate
這時會跳出錯誤訊息:
Type 'MainViewController' does not conform to protocol 'LoginViewControllerDelegate'
因為協定的內容是必需建立一個委派函數


加上成員函數 didLogin()
    func didLogin(userId: Int, userName: String) {
        self.userId = userId
        self.userName = userName
        self.loginButton.title = "登出"
    }
將登入頁取得的ID與名稱存到這個類別的成員變數
並將登入按鈕的顯示文字改為登出


修改成員函數 prepare()
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "LoginSegue" {
            let loginViewController = segue.destination as! LoginViewController
            loginViewController.delegate = self
        }
    }
在 storyboard 將點擊登入鈕連至登入頁的 Segue 設定 Identifier 為「LoginSegue」

在使用 Segue 跳頁時將主頁面的位址存在登入頁的成員變數 delegate
這樣登入頁才能使用 delegate.didLogin()
執行主頁面的成員函數 didLogin()


寫成協定的好處是,登入頁的協定也可以用在別的頁面上
此時委派函數 didLogin() 就可以依不同的頁面實作不同的內容
例如登入後要在某個 Label 顯示使用者名稱之類的


參考
StackOverflow Delegates in swift?






--
※ 作者: Knuckles 時間: 2017-04-28 19:20:23
※ 編輯: Knuckles 時間: 2017-04-28 19:23:13
※ 看板: KnucklesNote 文章推薦值: 0 目前人氣: 0 累積人氣: 350 
分享網址: 複製 已複製
r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇