TextField更改后,NavigationLink关闭

时间:2020-09-05 19:06:45

标签: swiftui

我的导航堆栈无法正常工作。

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

我在以下代码中遇到2个问题:

  1. 在TextField的第一个按键中,详细信息视图被关闭
  2. 值本身未更改

另外,我想必须有一种更方便的方法在详细视图中进行绑定...

这是代码:

import SwiftUI

@main
struct TestApp: App {
    var body: some Scene {
        WindowGroup {
            TestMainView()
        }
    }
}

struct TestMainView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink("List View", destination: TestListView())
            }
            .navigationTitle("Test App")
        }
    }
}

struct TestListView: View {
    @State var strings = [
        "Foo",
        "Bar",
        "Buzz"
    ]
    
    @State var selectedString: String? = nil
    
    var body: some View {
        List(strings.indices) { index in
            NavigationLink(
                destination: TestDetailView(selectedString: $selectedString),
                tag: strings[index],
                selection: $selectedString) {
                Text(strings[index])
            }
            .navigationBarTitleDisplayMode(.inline)
            .navigationTitle("List")
        }
    }
}

struct TestDetailView: View {
    @Binding var selectedString: String?
    
    var body: some View {
        VStack {
            if let _ = selectedString {
                TextField("Placeholder",
                          text: Binding<String>( //what's a better solution here?
                            get: { selectedString! },
                            set: { selectedString = $0 }
                          )
                )
                .padding()
                .textFieldStyle(RoundedBorderTextFieldStyle())
            }
            Spacer()
        }
        .navigationTitle("Detail")
    }
}

struct TestMainView_Previews: PreviewProvider {
    static var previews: some View {
        TestMainView()
    }
}

我显然做错了,但是我不知道该怎么做...

1 个答案:

答案 0 :(得分:1)

您正在['oatmeal', 'banana']内部更改NavigationLink的selection,这将迫使NavigationLink重新加载。

您可以尝试以下方法:

TestListView