在 Swift 视图之间共享数据?

问题描述 投票:0回答:1

我正在尝试使用 @Obervable 协议与多个视图共享数据,但无法使其正常工作。

我创建了一个简单的应用程序来演示我遇到的问题,您将会看到。 它包括:

  • DemoApp.swift
  • ContentView.swift
  • 模型.swift
  • SecondView.swift

我遇到的麻烦是将数据传递到“SecondView” 在 ContentView 内一切正常,但在 ContentView 之外就不行了。

有人可以看一下这个简单的代码并告诉我哪里出错了。

皮特

DemoApp.swift

import SwiftUI

@main
struct DemoApp: App {
    @State private var data = ModelData()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(data)
        }
    }
}

ContentView.swift

import SwiftUI

struct ContentView: View {
    @Bindable var data = ModelData()
    
    var body: some View {
        NavigationStack {
            VStack {
                TextField("Value", text: $data.value)
                Text("\(data.value)")
                
                NavigationLink {
                    SecondView()
                        .onAppear() {
                            data.Compute()
                        }
                } label: {
                    Text("Button")
                }
            }
        }
    }
}

#Preview {
    ContentView()
}

模型.swift

import Foundation
import Observation

@Observable
class ModelData {
    var value = ""
    
    func Compute() {
        print(self.value)
    }
}

SecondView.swift

import SwiftUI

struct SecondView: View {
    var data = ModelData()

    var body: some View {
        Text("You Typed: \(data.value)")
    }
}

#Preview {
    SecondView()
}
swiftui observable ios17 bindable xcode16
1个回答
0
投票

尝试这个方法:

import Foundation
import SwiftUI


struct ContentView: View {
    @Environment(ModelData.self) var data // <--- here

    var body: some View {
        @Bindable var data = data  // <--- here
        NavigationStack {
            VStack {
                TextField("Value", text: $data.value)
                Text("\(data.value)")
                
                NavigationLink {
                    SecondView()
                        .onAppear() {
                            data.Compute()
                        }
                } label: {
                    Text("Button")
                }
            }
        }
    }
}

@Observable
class ModelData {
    var value = ""
    
    func Compute() {
        print(self.value)
    }
}

struct SecondView: View {
    @Environment(ModelData.self) var data // <--- here

    var body: some View {
        Text("You Typed: \(data.value)")
    }
}

请参阅此链接在应用程序中管理模型数据

© www.soinside.com 2019 - 2024. All rights reserved.