Swiftui 文本字段更改后NavigationLink将解除

Swiftui 文本字段更改后NavigationLink将解除,swiftui,Swiftui,我有一个导航堆栈,它不能按预期工作 在我的主视图中,我想切换到一个列表视图,在本例中,该视图表示一个字符串数组。 然后,我希望导航到详细视图,在该视图中,我希望能够更改选定字符串的值 我对以下代码有2个问题: 在TextField中的第一次按键时,细节视图将被取消 值本身没有被更改 另外,我认为必须有一种更方便的方式在细节视图中进行绑定 代码如下: 导入快捷界面 @主要 struct TestApp:App{ var body:一些场景{ 窗口组{ TestMainView() } } } 结构

我有一个导航堆栈,它不能按预期工作

在我的主视图中,我想切换到一个列表视图,在本例中,该视图表示一个字符串数组。 然后,我希望导航到详细视图,在该视图中,我希望能够更改选定字符串的值

我对以下代码有2个问题:

  • 在TextField中的第一次按键时,细节视图将被取消
  • 值本身没有被更改
  • 另外,我认为必须有一种更方便的方式在细节视图中进行绑定

    代码如下:

    导入快捷界面
    @主要
    struct TestApp:App{
    var body:一些场景{
    窗口组{
    TestMainView()
    }
    }
    }
    结构TestMainView:视图{
    var body:一些观点{
    导航视图{
    名单{
    NavigationLink(“列表视图”,目标:TestListView())
    }
    .navigationTitle(“测试应用程序”)
    }
    }
    }
    结构TestListView:视图{
    @状态变量字符串=[
    “福”,
    “酒吧”,
    “嗡嗡声”
    ]
    @状态变量selectedString:字符串?=nil
    var body:一些观点{
    列表(strings.index){中的索引
    导航链接(
    目的地:TestDetailView(selectedString:$selectedString),
    标记:字符串[索引],
    选择:$selectedString){
    文本(字符串[索引])
    }
    .navigationBarTitleDisplayMode(.inline)
    .navigationTitle(“列表”)
    }
    }
    }
    结构TestDetailView:视图{
    @绑定变量selectedString:String?
    var body:一些观点{
    VStack{
    如果let=selectedString{
    文本字段(“占位符”,
    text:Binding(//这里有什么更好的解决方案?
    获取:{selectedString!},
    集合:{selectedString=$0}
    )
    )
    .padding()
    .textFieldStyle(RoundedBorderTextFieldStyle())
    }
    垫片()
    }
    .navigationTitle(“详细信息”)
    }
    }
    结构TestMainView\u预览:PreviewProvider{
    静态var预览:一些视图{
    TestMainView()
    }
    }
    

    我显然做错了,但我不知道该怎么做……您正在从
    NavigationLink
    内部更改NavigationLink的
    选择,从而强制
    TestListView
    重新加载

    您可以尝试以下方法:

    struct TestListView: View {
        @State var strings = [
            "Foo",
            "Bar",
            "Buzz",
        ]
    
        var body: some View {
            List(strings.indices) { index in
                NavigationLink(destination: TestDetailView(selectedString: self.$strings[index])) {
                    Text(self.strings[index])
                }
            }
        }
    }
    
    struct TestDetailView: View {
        @Binding var selectedString: String // remove optional
    
        var body: some View {
            VStack {
                TextField("Placeholder", text: $selectedString)
                    .padding()
                    .textFieldStyle(RoundedBorderTextFieldStyle())
                Spacer()
            }
        }
    }
    

    这很好地解释了实际发生的事情以及为什么我的观点会被否定——谢谢。我想这应该是一个简单的任务——拥有一个能够编辑和添加到我的模型中的导航;你有学习材料的链接吗?(我知道这与我原来的问题没有什么关系——只是不想在这里把这个具体问题过度复杂化…@ASSeeger不幸的是,我不知道有任何专门针对NavigationLink+TextField组合的教程。但是,如果您的代码有任何其他问题,您可以随时发布另一个问题-我会尽力帮助您。