iT邦幫忙

2021 iThome 鐵人賽

DAY 22
0

前言

好像沒什麼前言可說XD
就是把logout功能做出來~~
如此一來我們就可以測試登入/註冊功能是否能成功跳轉到相對應的頁面,同時也開始開發profile view controller的部分。

Logout

ProfileViewController

首先引入相關的libraries。

import UIKit
import FirebaseAuth

ProfileViewController

接著,因為我們希望profile view能顯示一些設定、登出之類的功能,因此同樣選用table view。
接著我們將這個sign out元件放入table view中,並將指派對象指定為自己。

class ProfileViewController: UIViewController {
    
    @IBOutlet var tableView: UITableView!
    
    let data = ["Sign Out"]
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        tableView.delegate = self
        tableView.dataSource = self
    }
}

Extension

刻意練習,先前都提過UIViewController沒有實作指派的功能,因此我們將額外繼承其他的class,並實作出以下3個必要的方法。

  1. table view的行數
  2. table view的內容
extension ProfileViewController: UITableViewDelegate, UITableViewDataSource {
    //numberofrow
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }
    
    //cellforrow
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        cell.textLabel?.textAlignment = .center
        cell.textLabel?.textColor = .red
        return cell
    }

接著第三個,是點選該行之後的行為。
我們預期使用者點選sign out之後,firebase auth應該要能夠收到已登出的訊息,一來使得該使用者無法在app內有行為、二來該使用者可以再次登入。

因此我們使用addAction,並在handler加入方法,通知firebase auth進行登出。

最後將畫面跳轉離開。

    //selectrow
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        
        let actionSheet = UIAlertController(title: "Sure to sign out",
                                            message: "",
                                            preferredStyle: .actionSheet)
        
        actionSheet.addAction(UIAlertAction(title: "Sign out",
                                            style: .destructive,
                                            handler: { [weak self] _ in
                                                guard let strongSelf = self else{
                                                    return
                                                }
                                                
                                                do {
                                                    try FirebaseAuth.Auth.auth().signOut()
                                                    
                                                    let vc = LoginViewController()
                                                    let nav = UINavigationController(rootViewController: vc)
                                                    nav.modalPresentationStyle = .fullScreen // if not-> pop up as a card
                                                    strongSelf.present(nav, animated: true)
                                                }
                                                catch {
                                                    print("Fail to log out")
                                                }
                                            }))
        
        actionSheet.addAction(UIAlertAction(title: "Cancel",
                                            style: .cancel,
                                            handler: nil))
        
        present(actionSheet, animated: true)
    }
}

結語

若上述內容有誤或可以改進的部分,歡迎留言以及提出任何指教~
謝謝 (´・∀・`)


上一篇
Day#21 Chat
下一篇
Day#23 github連結先來
系列文
來寫看看app好了! Swift探索之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言