NavigationLink 101:如何将数据从主机发送到辅助视图?

Posted

技术标签:

【中文标题】NavigationLink 101:如何将数据从主机发送到辅助视图?【英文标题】:NavigationLink 101: How to send data from the host to the secondary View? 【发布时间】:2021-04-18 02:21:43 【问题描述】:

目标:通过 NavigationLink 将每个列表行的 struct 简单地传递给辅助视图。

Baby Step(优先目标):仅将字符串数组的成员传递给辅助视图。

问题:辅助视图期望参数调用中的 Binding-String 值与上下文中的 closure String 值。

所以我必须在调用之前将@State var 设置为当前/上下文值。

这是我的问题。我不能简单地将 Binding var 等同于当前上下文 var;因为在 SwiftUI 中,此类语句仅限于基于 View 的内容。

这不起作用:

这是实际的代码:

import SwiftUI
  
struct ContentView: View 
    @State var name = ""   //... load with inital value to avoid having to add a call parameter.
    
    var body: some View 
        let myArray = ["Larry", "Moe", "Curly"]
        NavigationView 
            List(myArray, id: \.self)  theStooge in
                NavigationLink(destination: SecondView(stoogeName: theStooge)) 
                    Text(theStooge)
                
            
            .navigationBarTitle("Three Stooges").navigationBarTitleDisplayMode(.inline)
        
    


struct SecondView: View 
    @Binding var stoogeName: String
    var body: some View 
        Text("Hello \(name)")
    

我只能通过 NavigationLink 的目标参数中的 Text("Hello World") 创建 SecondView。但这不是很有帮助。我想将数据(数据结构)传递给每个列表成员的辅助视图。

但我需要设置一个绑定变量。 如何? 我必须对 EnvironmentObject 或 Singleton 进行陪审吗?

【问题讨论】:

【参考方案1】:

绑定可以设置为动态属性,但您的数组是常量局部变量。这是使用绑定的可能解决方案:

struct ContentView: View 
    @State var name = ""   //... load with inital value to avoid having to add a call parameter.
    
    @State private var myArray = ["Larry", "Moe", "Curly"]

    var body: some View 
        NavigationView 
            List(myArray.indices, id: \.self)  index in
                NavigationLink(destination: SecondView(stoogeName: $myArray[index])) 
                    Text(myArray[index])
                
            
            .navigationBarTitle("Three Stooges").navigationBarTitleDisplayMode(.inline)
        
    

【讨论】:

以上是关于NavigationLink 101:如何将数据从主机发送到辅助视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SwiftUI 将上下文菜单添加到 NavigationLink?

如何通过 NavigationLink 将 ForEach 数组索引传递到另一个 ForEach 而不会崩溃?

如何在另一个 NavigationLink 中有一个 NavigationLink

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

如何以编程方式触发 NavigationLink?

如果它不可见,SwiftUI 如何使 NavigationLink 工作?