首页 > 解决方案 > SwiftUI 认证视图

问题描述

在 swift UI 中,我希望内容视图成为我的应用程序的根视图,并通过条件设置检查用户是否登录。如果用户已登录列表视图,则显示其他明智的登录视图,以便用户可以登录。根据我的研究,我找不到最好的方法来做到这一点。

就我而言,我无法找到我发现的解决方案,也不知道它是否是最佳解决方案。

import SwiftUI

struct ContentView: View {
    @ObservedObject var userAuth: UserAuth = UserAuth()
    // MARK: - View

    @ViewBuilder
    var body: some View {
        if !userAuth.isLoggedin {
            return LoginView().environmentObject(userAuth)
        } 
        return  BookList()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

import Combine

class UserAuth: ObservableObject {

    let didChange = PassthroughSubject<UserAuth,Never>()

    // required to conform to protocol 'ObservableObject'
    let willChange = PassthroughSubject<UserAuth,Never>()

    func login() {
        // login request... on success:
        self.isLoggedin = true
    }

    func logout() {
        // login request... on success:
        self.isLoggedin = false
    }

    var isLoggedin = false {
        didSet {
            didChange.send(self)
        }

//        willSet {
//            willChange.send(self)
//        }
    }
}

运行此程序时,我得到的只是白屏。似乎视图构建器可能是问题所在,但删除我在内容视图上遇到不透明错误

标签: swiftswiftui

解决方案


提供的代码快照有两个问题:1)不正确的视图构建器内容,2)不正确的模型。

见下文两者均已修复。使用 Xcode 11.4 / iOS 13.4 测试

struct ContentView: View {
    @ObservedObject var userAuth: UserAuth = UserAuth()
    // MARK: - View

    @ViewBuilder              // no need return inside
    var body: some View {
        if !userAuth.isLoggedin {
            LoginView().environmentObject(userAuth)
        }
        else {
            BookList()
        }
    }
}

import Combine

class UserAuth: ObservableObject {
    @Published var isLoggedin = false     // published property to update view

    func login() {
        // login request... on success:
        self.isLoggedin = true
    }

    func logout() {
        // login request... on success:
        self.isLoggedin = false
    }
}

推荐阅读