登录后更新 TabView 并移至 Home View
Update TabView and move to Home View after login
我在 ContentView 中有以下 TabView。对于 onAppear,它工作正常。但是,我也在尝试重新加载选项卡并在用户从 LoginView 登录后移动到主页。
ContentView的代码如下
// 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
TabView 没有更新。我怎样才能做到这一点,并在登录后将用户移动到主视图。
它在 ContentView
和 LoginView
中使用了不同的 User()
实例。这是一个解决方案:
struct LoginView: View {
@ObservedObject var user: User // << only declare
这里
LoginView(user: self.user) // << inject own user instance
.tabItem {
VStack {
Image(systemName: "person.fill")
Text("Me")
}
}.tag(1)
我在 ContentView 中有以下 TabView。对于 onAppear,它工作正常。但是,我也在尝试重新加载选项卡并在用户从 LoginView 登录后移动到主页。
ContentView的代码如下
// 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
TabView 没有更新。我怎样才能做到这一点,并在登录后将用户移动到主视图。
它在 ContentView
和 LoginView
中使用了不同的 User()
实例。这是一个解决方案:
struct LoginView: View {
@ObservedObject var user: User // << only declare
这里
LoginView(user: self.user) // << inject own user instance
.tabItem {
VStack {
Image(systemName: "person.fill")
Text("Me")
}
}.tag(1)