swift - 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)
// }
}
}
运行此程序时,我得到的只是白屏。似乎视图构建器可能是问题所在,但删除我在内容视图上遇到不透明错误
解决方案
提供的代码快照有两个问题: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
}
}
推荐阅读
- java - 为什么不能一起使用 Mock 和 SpyBean 有一个简单的原因吗?
- sql - 使用数据透视函数保持多字符串字段的顺序?
- r - 当数据框中只知道分钟和秒时,如何显示小时项?
- security - 存在“严格动态”,因此禁用了基于主机的白名单
- docusignapi - DocuSign C# 基础项目的重定向 URL 应该是什么?
- java - 带有继承的 Java 中的 NullPointerException
- c# - 我的 C# DotNet DLL 被 Windows Defender 检测为勒索软件
- biztalk - BizTalk 或 SSIS
- csv - 带有 INTO OUTFILE 指令的 SQL 请求语法错误
- react-native - React Native 设置输入焦点