登录后更新TabView并移至主视图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了登录后更新TabView并移至主视图相关的知识,希望对你有一定的参考价值。

我在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没有更新。如何实现此目标,并在登录后将用户移至家庭视图。

答案

User()ContentView中使用了不同的LoginView实例。这是一个解决方案:

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)

以上是关于登录后更新TabView并移至主视图的主要内容,如果未能解决你的问题,请参考以下文章

删除视图控制器并移至下一个视图控制器

切换选项卡时删除所有子视图控制器并移至父视图控制器 IOS 目标 c

如何忽略-inf并移至for循环中的下一个迭代

Geoserver并移至HTTPS

Python文件读取行以endswith开头并移至列表[关闭]

更新后wkhtmltopdf字体大小增加