之前写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