假设一个场景,用户看到一条有趣的新闻想要点赞时,发现没有登录就跳转到登录页面,当用户登录完成或者注册完成返回时,大多数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()
})