我在 iOS 应用中有一些屏幕使用了 NavigationStack(或 NavigationView),其中包含不同的元素。其中一个是可搜索列表,它被包装在 NavigationLink 中。因此,这个可搜索列表会显示在新屏幕中。
当用户选择列表中的某个元素时,他应该自动返回到上一屏幕,而无需另外单击两次取消(如果使用搜索)然后单击“返回”按钮。
有没有什么正确的方法可以做到这一点?谢谢你的建议!
import SwiftUI
struct TheItem: Identifiable {
let id = UUID()
let name: String
}
class SomeModel: ObservableObject {
@Published var selectedId: UUID?
@Published var searchText: String = ""
var items: [TheItem] = [
TheItem(name:"Item 1"),
TheItem(name:"Item 2"),
TheItem(name:"Item 3"),
// ...
TheItem(name:"Item N")
]
var filteredItems: [TheItem] {
guard !searchText.isEmpty else { return self.items }
return self.items.filter { item in
item.name.lowercased().contains(self.searchText.lowercased())
}
}
var selectedItemName: String {
if selectedId != nil {
return filteredItems.first(where: {$0.id == selectedId})?.name ?? "-"
}
return "-"
}
init () {
selectedId = items.first?.id
}
}
struct TestNavigationLinkBackkView: View {
@EnvironmentObject private var model: SomeModel
var body: some View {
NavigationStack {
NavigationLink(model.selectedItemName) {
List {
Picker("Item", selection: $model.selectedId) {
ForEach(model.filteredItems) { item in
Text(item.name).tag(item.id)
}
}
}
.searchable(text: $model.searchText, placement: .navigationBarDrawer(displayMode: .always))
.pickerStyle(.inline)
}
}
}
}
#Preview {
TestNavigationLinkBackkView()
.environmentObject(SomeModel())
}
如果您将该部分拆分成
List
单独的部分View
,则可以dismiss
在选择发生变化时调用。这将从中弹出当前视图NavigationStack
。文件指出:
dismiss
这就是为什么需要将子视图分解为单独的
View
。