【问题标题】:How can I use a common variable in a Tab VIew?如何在 Tab VIew 中使用公共变量?
【发布时间】:2020-09-03 10:28:59
【问题描述】:

我目前正在使用 SwiftUI 开发应用程序。

这个应用有 3 个结构

  • ①内容视图
  • ②第一视图
  • ③二视图

这 3 个结构在 Tab View 中进行页面转换。

而且这个应用程序有一个使用 ObservableObject 注解的 Bool 通用变量类型。


我想在 FirstView 和 SecondView 中更改为出现和消失的 Text View 取决于变量的条件,但 FirstView 并没有像我预期的那样更改视图...

我该如何解决这种情况?


代码如下:

ContentView.swift

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            FirstView()
                .tabItem {
                    Text("First")
            }.tag(1)

            SecondView()
                .tabItem {
                    Text("Second")
            }.tag(2)
        }
    }
}

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

FirstView.swift

import SwiftUI

struct FirstView: View {

    @ObservedObject var firstCheck: ViewModel = ViewModel() 

    var body: some View {
        VStack{
            if firstCheck.check == true{
                    Text("checked")
            }
        }
    }
}

struct FirstView_Previews: PreviewProvider {
    static var previews: some View {
        FirstView()
    }
}

SecondView.swift

import SwiftUI

struct SecondView: View {

    @ObservedObject var secondCheck = ViewModel()


    var body: some View {
        VStack{
            Toggle(
                isOn: $secondCheck.check
            ){
                Text("change")
            }
            if self.secondCheck.check == true{
                Text("checked")
            }
        }
    }
}

struct SecondView_Previews: PreviewProvider {
    static var previews: some View {
        SecondView()
    }
}

ViewModel.swift

import Foundation

final class ViewModel: ObservableObject {
    @Published var check: Bool = false
}

Xcode:版本 11.7

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    将对象保存在一个地方,可以是父视图

    struct ContentView: View {
        @ObservedObject var viewModel = ViewModel()
    //    @StateObject var viewModel = ViewModel()     // SwiftUI 2.0
    
    
        var body: some View {
            TabView {
               // .. other code here
            }
            .environmentObject(viewModel)   // << inject here
        }
    }
    

    然后在两个视图中使用(第二个相同)

    struct FirstView: View {
    
        @EnvironmentObject var firstCheck: ViewModel   // declare only
                                                       // will be injected by type
    
        var body: some View {
            VStack{
                if firstCheck.check == true{
                        Text("checked")
                }
            }
        }
    }
    

    【讨论】:

    • 感谢您的帮助,现在代码运行良好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多