Swiftui 登录后更新选项卡视图并移动到主视图
我在ContentView中有FLOWING选项卡。对于onAppear,它工作得很好。但是,我也尝试在用户从LoginView登录后重新加载选项卡并移动到主页 以下是ContentView的代码Swiftui 登录后更新选项卡视图并移动到主视图,swiftui,swiftui-environment,Swiftui,Swiftui Environment,我在ContentView中有FLOWING选项卡。对于onAppear,它工作得很好。但是,我也尝试在用户从LoginView登录后重新加载选项卡并移动到主页 以下是ContentView的代码 // ContentView.swift // Matjri // // import SwiftUI struct ContentView: View { @ObservedObject var user = User() var body: some View {
// ContentView.swift
// Matjri
//
//
import SwiftUI
struct ContentView: View {
@ObservedObject var user = User()
var body: some View {
HStack{
if (user.tokenIsActive) {
TabView {
HomeView()
.tabItem {
VStack {
Image(systemName: "house")
Text("Home")
}
}.tag(0)
UserPostsView()
.tabItem {
VStack {
Image(systemName: "person.fill")
Text("Me")
}
}.tag(1)
NewPostView()
.tabItem {
VStack {
Image(systemName: "plus")
Text("Add")
}
}.tag(2)
SearchView()
.tabItem {
VStack{
Image(systemName: "magnifyingglass")
Text("Search")
}
}.tag(3)
}
} else {
TabView {
HomeView()
.tabItem {
VStack {
Image(systemName: "house")
Text("Home")
}
}.tag(0)
LoginView()
.tabItem {
VStack {
Image(systemName: "person.fill")
Text("Me")
}
}.tag(1)
SearchView()
.tabItem{
VStack{
Image(systemName: "magnifyingglass")
Text("Search")
}
}.tag(2)
}
}
}
.onAppear() {
self.checkLoginValidity()
}
}
func checkLoginValidity() {
let userLogged = UserDefaults.standard.object(forKey: "userIsLogged") as? Bool ?? false
if (userLogged) {
let existinLogin = UserDefaults.standard.object(forKey: "loginExpiry") as! Date
if (existinLogin > Date().addingTimeInterval(86400 * 2)){
self.user.tokenIsActive = true
} else {
self.user.tokenIsActive = false
}
} else {
self.user.tokenIsActive = false
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
当用户从LoginView登录时,我将tokenIsActive设置为true
struct LoginView: View {
@ObservedObject var user = User()
........
//Login successful
self.user.tokenIsActive = true
选项卡视图未更新。如何实现这一点,并在登录后将用户移动到homeview。在
ContentView
和LoginView
中使用不同的user()
实例。以下是一个解决方案:
struct LoginView: View {
@ObservedObject var user: User // << only declare
struct LoginView:View{
@ObservedObject var user:user//谢谢。现在在LoginView中,我发现预览结构“调用中缺少参数“user”的参数”有一个错误@Abdullah,是的,在使用LoginView的所有地方,都应该像我的第二个代码快照一样进行。对不起,更改没有效果。也许我遗漏了什么。我应该在下一篇帖子回复中共享完整的代码吗?@Abdullah,你可以编辑/更新你的问题并添加到那里,或者提供链接,如果有的话。我错了。发完这篇帖子后,我想it’他正在尝试我的帖子来整理它,并修改了代码。现在它工作得很好。非常感谢。
LoginView(user: self.user) // << inject own user instance
.tabItem {
VStack {
Image(systemName: "person.fill")
Text("Me")
}
}.tag(1)