看板 KnucklesNote
作者 標題 [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),名稱為 LoginViewControllerDelegatefunc didLogin(userId: Int, userName: String)
}
協定內容為,需要建立一個委派函數 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與名稱存到這個類別的成員變數self.userId = userId
self.userName = userName
self.loginButton.title = "登出"
}
並將登入按鈕的顯示文字改為登出
修改成員函數 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」if segue.identifier == "LoginSegue" {
let loginViewController = segue.destination as! LoginViewController
loginViewController.delegate = self
}
}
在使用 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 累積人氣: 353
回列表(←)
分享