假設一個場景,用戶看到一條有趣的新聞想要點贊時,發現沒有登錄就跳轉到登錄頁面,當用戶登錄完成或者注冊完成返回時,大多數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()
})