SwiftUI 登录和主界面切换列子

  • 之前写iOS代码涉及到登录和主页的切换,个人喜欢使用rootviewController来切换,利用回调出发切换,当我使用swiftUI的时候,我发现,如果不修改appdelegate的结构的情况下无法拿到window,所以想了想怎么去实现这个相同的功能,在不破坏现有的window结构的情况下

  • 利用一个全局的model: ObservableObject

  • @Published var loginFlag: Bool = false //是否登录过 true登录过
    具体代码图下

  • Model
import Foundation

enum UserDefaultKey: String {
    case login = "LoginDefaultKey"
}

class User: ObservableObject {
    
    @Published var loginFlag: Bool = false  //是否需要登录    false需要    true 不需要
    
    static let user = User()
    
    func getLoginFlag() -> Bool{
        let b = UserDefaults.standard.bool(forKey: UserDefaultKey.login.rawValue)
        print("\(b ? "true: Home": "false: Login")")
        return b
    }
    
    func setLoginFlag(flag: Bool){
        UserDefaults.standard.set(flag, forKey: UserDefaultKey.login.rawValue)
        if(UserDefaults.standard.synchronize()){
            print("\(flag ? "true: 登录成功跳到主界面": "false: 登出成功跳到登录界面")")
            self.loginFlag = flag
        }else{
            print("存储失败")
            self.loginFlag = !flag
        }
        
    }
}

  • Login
import SwiftUI

struct Login: View {
    
    @ObservedObject var user = User.user
    
    var body: some View {
        NavigationView {
            Button(action: {
                
                self.user.setLoginFlag(flag: true)
            }) {
                Text("登录")
                    .frame(width: UIScreen.main.bounds.size.width - 30, height: 50)
                    .font(.system(size: 16))
                    .foregroundColor(Color.purple)
                    .overlay(RoundedRectangle(cornerRadius: 25).stroke(lineWidth: 0.5).foregroundColor(Color.purple))
                
            }.background(Color.white).offset(x: 0, y: 40)
            
            .navigationBarTitle("Login")
        }
    }
}

#if DEBUG
struct Login_Previews: PreviewProvider {
    static var previews: some View {
        Login()
    }
}
#endif
  • Home
import SwiftUI

struct Home: View {
    
    @ObservedObject var user = User.user
    
    var body: some View {
        NavigationView {
            Button(action: {
                self.user.setLoginFlag(flag: false)
            }) {
                Text("退出登录")
                    .frame(width: UIScreen.main.bounds.size.width - 30, height: 50)
                    .font(.system(size: 16))
                    .foregroundColor(Color.purple)
                    .overlay(RoundedRectangle(cornerRadius: 25).stroke(lineWidth: 0.5).foregroundColor(Color.purple))
                
            }.background(Color.white).offset(x: 0, y: 40)
            
            .navigationBarTitle("Home")
        }
    }
}

#if DEBUG
struct Home_Previews: PreviewProvider {
    static var previews: some View {
        Home()
    }
}
#endif
  • ContentView
import SwiftUI

struct ContentView: View {
    
    @ObservedObject var user = User.user
    
    init() {
        user.loginFlag = user.getLoginFlag()
    }
    
    var body: some View {
        (user.loginFlag ? AnyView(Home()) : AnyView(Login()))
    }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
#endif

注意,UserDefaults真机测试,模拟器偶尔会取值失败

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容