Ios 是否以快速/更好的方法在视图之间共享数据?

Ios 是否以快速/更好的方法在视图之间共享数据?,ios,swift,swiftui,Ios,Swift,Swiftui,我是Swift和SwiftUi的新手,我决定在这个夏天取乐,把它放在我的简历上。作为一名大学生,我的第一个想法是使用一个支票计算器来计算支票上的每个人欠付账人的钱。现在,我有一个介绍屏幕,然后在文本框中添加一个新视图,以添加订购支票的人的姓名。我将这些名字存储在一个数组中,接下来我想创建一个新视图,询问添加的每个人,他们的个人总数是多少?我正在努力在不同的结构之间共享数据。如果您能提供任何帮助,我们将不胜感激。如果没有多个视图,是否有更好的方法?无论如何,这是我的代码(由于复制和粘贴的原因,间距

我是Swift和SwiftUi的新手,我决定在这个夏天取乐,把它放在我的简历上。作为一名大学生,我的第一个想法是使用一个支票计算器来计算支票上的每个人欠付账人的钱。现在,我有一个介绍屏幕,然后在文本框中添加一个新视图,以添加订购支票的人的姓名。我将这些名字存储在一个数组中,接下来我想创建一个新视图,询问添加的每个人,他们的个人总数是多少?我正在努力在不同的结构之间共享数据。如果您能提供任何帮助,我们将不胜感激。如果没有多个视图,是否有更好的方法?无论如何,这是我的代码(由于复制和粘贴的原因,间距有点小):


在SwiftUI中,在视图之间传递数据有多个级别。每一个都有它最好的用例

  • 静态初始化属性
  • 绑定属性
  • 环境对象
静态初始化属性。 您可能已经习惯了,它只是通过view init函数传递常量,如下所示:

struct MyView: View {
    var body: some View {
        MyView2(title: "Hello, world!")
    }
}

struct MyView2: View {
    let title: String
    var body: some View {
        Text(title)
    }
}
// Your observable object
class MyViewManager: ObservableObject {
    @Published var title: String

    init(title: String) {
        self.title = title
    }
}

struct MyView: View {
    // Store your Observable object in the parent View
    @StateObject var manager = MyViewManager(title: "")

    var body: some View {
        MyView2()
            // Pass the manager to MyView2 and its children
            .environmentObject(manager)
    }
}

struct MyView2: View {
    // Read and Write access to parent environment object
    @EnvironmentObject var manager: MyViewManager

    var body: some View {
        VStack {
            // Read and write to the manager title property
            TextField("My title field", text: $manager.title)
            MyView3()
                // .environmentObject(manager)
                // No need to pass the environment object again, it is passed by inheritance.
        }
    }
}

struct MyView3: View {
    @EnvironmentObject var manager: MyViewManager

    var body: some View {
        TextField("My View 3 title field", text: $manager.title)
    }
}
绑定属性。 这使您能够在父视图和子视图之间传递数据。父视图可以在初始化和更新该值时将该值传递给子视图,子视图可以更新该值本身(它也会接收)

环境对象。 这些与绑定属性的工作原理相同,但区别在于:它通过所有子视图全局传递值。但是,该属性将是一个来自Apple Combine API的“ObservableObject”。它的工作原理如下:

struct MyView: View {
    var body: some View {
        MyView2(title: "Hello, world!")
    }
}

struct MyView2: View {
    let title: String
    var body: some View {
        Text(title)
    }
}
// Your observable object
class MyViewManager: ObservableObject {
    @Published var title: String

    init(title: String) {
        self.title = title
    }
}

struct MyView: View {
    // Store your Observable object in the parent View
    @StateObject var manager = MyViewManager(title: "")

    var body: some View {
        MyView2()
            // Pass the manager to MyView2 and its children
            .environmentObject(manager)
    }
}

struct MyView2: View {
    // Read and Write access to parent environment object
    @EnvironmentObject var manager: MyViewManager

    var body: some View {
        VStack {
            // Read and write to the manager title property
            TextField("My title field", text: $manager.title)
            MyView3()
                // .environmentObject(manager)
                // No need to pass the environment object again, it is passed by inheritance.
        }
    }
}

struct MyView3: View {
    @EnvironmentObject var manager: MyViewManager

    var body: some View {
        TextField("My View 3 title field", text: $manager.title)
    }
}

希望能有所帮助。如果是的话,不要忘了将这个答案标记为正确答案。这可能是一个很好的观点,可以通过一些SwiftUI教程了解基本知识。SwiftUI是一个很好且流行的工具,了解视图和模型的分离尤为重要
@State
@Binding
属性对于简单值或本地值都可以,但对于整个应用程序数据,您需要一个单独的模型。