1

我想做一个项目,用户可以在一个视图中写下名称。在另一个视图中,其中的一个随机名称显示为用户的文本。

我尝试通过正常引用来执行此操作,但是当我尝试在第二个视图中引用它时,第一个视图中包含所有名称的数组是空的。

代码看起来像这样:

//ContentView:
@State var player1 = ""
@State var array = [String]()

//body:
NavigationView {
            VStack() {
                TextField("name", text: $player1)
                Button("append") {
                    array.append(player1)
                }
                NavigationLink("to next page", destination: secondView())
            }
        }

//secondView:
var ref = ContentView()

//body:
Text(ref.array1[0])

有人知道如何制作这样的东西吗?

4

1 回答 1

1

您的问题的答案取决于您在第二个视图中想要对数据执行的操作。

如果您打算只在第二个视图中吐出信息而不修改它,那么您可以通过视图结构的初始化程序将数据传递给您的第二个视图。

方法 1:更简单、不具约束力的解决方案

使用您的array变量跟踪所有字符串输入,用@State.

struct InputView: View {

    @State var array: [String] = []

    var body: some View {
        // Add your list of string inputs here,
        // as well as your Append button...
    }
}

在您的第二个视图中,具有您要显示的字符串的属性(没有初始化值)。

struct OutputView: View {

    var displayString: String

    var body: some View {
         // Display your String here using Text...
    }
}

然后,在您InputView的 'sbody中,将随机元素从arrayinto传递给OutputView. 如果您的数组没有元素,您应该考虑传递一个默认值

NavigationLink(destination: OutputView(displayString: array.randomElement() ?? "none") {
    Text("To next page")
}

方法二:在另一个View中使用Binding修改

如果您需要在传递到您的值后修改它OutputView,请考虑使用Binding.

在您的InputView中,您可以将整个数组作为 a 传递Binding<Array<String>>到您的OutputView中,前提OutputView是准备好在您的类实现中Binding使用包装器来处理变量。@Binding

struct OutputView: View {
    @Binding var array: [String]

    // Display a random element from array here.
    // When you modify array, it will also modify the array
    // property that belongs to InputView.
    var body: some View {
         // ...
    }
}

您需要使用$运算符将​​数组作为Binding<>.

struct InputView: some View {

    @State var array: [String] = []

    var body: some View {
        // ...
        NavigationLink(destination: OutputView(array: $array) {
            Text("To next page")
        }
        // ...
    }
}
于 2021-07-20T03:10:32.553 回答