利用保存閉包回到登錄前的事件

假設一個場景,用戶看到一條有趣的新聞想要點贊時,發現沒有登錄就跳轉到登錄頁面,當用戶登錄完成或者注冊完成返回時,大多數App處理方式都是讓用戶再次操作點贊行為,才算完成這個流程,比較好的優化方式,是當用戶登錄完成返回以后,自動進行點贊,這個過程能連接上,先來看一張圖:

模擬登錄

登錄頁面LoginVC
注冊頁面RegisterVC
點贊詳情頁面TargetVC

1.登錄相關的操作

extension Bool {
    //是否登錄
    static var isLoginKey:Bool {
        let user = UserDefaults.standard.bool(forKey: "OnlineStatus") == true
        return user
    }
}
//用戶登出
func logout(){
    UserDefaults.standard.set(false, forKey: "OnlineStatus")
    UserDefaults.standard.synchronize()
}
//用戶登錄
func login(){
    UserDefaults.standard.set(true, forKey: "OnlineStatus")
    UserDefaults.standard.synchronize()
}

2.主要代碼

final class UserInfo{
    static let singleton = UserInfo()
    private init(){}
    var task:Task?
    func cancel() -> Void{
        if let unwrappedTask = task {
            unwrappedTask(true)
        }
    }
}

typealias Task = (_ cancel:Bool) -> Void

protocol LoginHandler {
    func checklogin(closure:@escaping ()->Void) -> Task
    func save(task:@escaping Task)
}

extension LoginHandler where Self:UIViewController {
    func checklogin(closure:@escaping ()->Void) -> Task {
        
        var result:Task?
        
        let autoClosure:Task = { cancel in
            if cancel == true {
                closure()
            }else{
                let login = LoginVC()
                let nav = UINavigationController(rootViewController: login)
                self.present(nav, animated: true, completion:nil)
            }
        }
        
        result = autoClosure
        
        return result!
    }
    
    func save(task:@escaping Task){
        
        if Bool.isLoginKey == false {
            task(false)
            UserInfo.singleton.task = task
        }else{
            task(true)
        }
        
    }
}

3.在首頁ViewController中需遵守LoginHandler協議:

class ViewController: UIViewController,LoginHandler {}
//按鈕點擊
func btnAction(){
     let task = checklogin {
     self.navigationController?.pushViewController(TargetVC(), animated: true)
        }
     save(task: task)
}

4.在完成登錄/注冊,利用模態方式返回時

dismiss(animated: true, completion: {
      UserInfo.singleton.cancel()
})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,268評論 25 708
  • 學習內容地址:http://blog.csdn.net/self_study/article/details/52...
    鮮果時光閱讀 622評論 0 0
  • 1. 于茯苓是我的一個校友,俄語專業,為人直爽,算是巾幗中的須眉。 說起我和茯苓的相識,還是挺不可思議的。三百多人...
    花心小五閱讀 732評論 3 7
  • 82788bc7faad閱讀 270評論 0 3
  • 我和誰都不爭,和誰爭我都不屑。我愛大自然,其次是藝術。我雙手烤著,生命之火取暖。火萎了,我也準備走了。——楊絳。 ...
    迎火蟲喲閱讀 275評論 0 0