【问题标题】:NavigationLink dismisses after TextField changes在 TextField 更改后 NavigationLink 关闭
【发布时间】:2020-09-06 07:11:37
【问题描述】:

我的导航堆栈没有按预期工作。

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

我对以下代码有 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()
    }
}

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

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    您正在从 NavigationLink 内部更改 NavigationLink 的 selection,这会强制 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 组合的教程。但是,如果您的代码有任何其他问题,您可以随时发布另一个问题 - 我会尽力帮助您。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多