swift - NavigationLink 不适用于 SwiftUI 3.0 上的新 .searchable 修饰符
问题描述
我正在尝试 Apple WWDC21 上介绍的 SwiftUI 3.0 的新功能。
特别是我正在尝试使用.searchable
修饰符在列表中实现搜索栏,并让用户使用NavigationLink
.
struct OrderItem : Identifiable {
let id = UUID()
var label : String
var value : Bool = false
}
struct BindingTest: View {
@State var items = [OrderItem(label: "Shirts"), OrderItem(label: "Pants"), OrderItem(label: "Socks")]
@State private var searchedText = ""
@ViewBuilder
var body: some View {
NavigationView {
List($items) { $item in
NavigationLink(destination: ItemView(item: $item)) {
HStack {
if(item.value) {
Image(systemName: "star.fill").foregroundColor(.yellow)
}
Text(item.label)
}
}
}.navigationBarTitle("Clothing")
// Search bar
.searchable(text: $searchedText, placement: .automatic) {
if searchedText != "" {
// Search result
ForEach($items.filter({$0.label.wrappedValue.contains(searchedText)})) { $item in
NavigationLink(destination: ItemView(item: $item)) {
HStack {
if(item.value) {
Image(systemName: "star.fill").foregroundColor(.yellow)
}
Text(item.label)
}
}.searchCompletion(item.label)
}
}
}
}
}
}
但是当我在搜索结果列表中并点击一个结果时,NavigationLink
它不起作用,它会显示原始列表。还有其他人遇到这个问题吗?
[编辑] 我在 .searchable 里面检查了这个 NavigationLink 不起作用,但不幸的是它没有回答我的问题,因为我NavigationLink
已经在 .searchable 里面了NavigationView
。
解决方案
您在这里有两个导航链接,一个在您的原始内容中,一个作为闭包传递给您的可搜索修饰符,它实际上在 searchText 更改时显示。后者不在导航视图内,因此无法导航到第二个屏幕。为了达到您的期望,您应该ForEach
在NavigationLink
原始内容本身中添加 ,并根据搜索文本过滤列表。
搜索完成应该是完成 searchText 的指导,而不是导航到第二个屏幕。
更新后的代码应该是这样的
struct BindingTest: View {
@State var items = [OrderItem(label: "Shirts"), OrderItem(label: "Pants"), OrderItem(label: "Socks")]
@State private var searchedText = ""
@ViewBuilder
var body: some View {
NavigationView {
List($items.filter({$0.label.wrappedValue.contains(searchedText)})) { $item in
NavigationLink(destination: ItemView(item: $item)) {
HStack {
if(item.value) {
Image(systemName: "star.fill").foregroundColor(.yellow)
}
Text(item.label)
}
}
}
.searchable(text: $searchedText, placement: .automatic) {
if searchedText != "" {
ForEach($items.filter({$0.label.wrappedValue.contains(searchedText)})) { $item in
Text(item.label).searchCompletion(item.label)
}
}
}
}
}
}
希望它能回答你的问题:)
推荐阅读
- c# - 可绘制“无法解析此资源 URL”
- javascript - 为什么 useEffect 没有被触发?
- javascript - 关于访问数组列的基本问题
- c - STM32F3 如何在 Timer 上触发 ADC 转换并使用循环 DMA 传输
- android - 配置 Android 应用以使用两个 Firebase 项目进行身份验证
- java - 无法在 JavaFX 中的热敏打印机上打印文本的全部内容
- flutter - 有没有办法在渲染之前计算文本宽度?
- python - 如何使用 Astroid 获取 if 语句中的条件数?
- pine-script - 有没有一种方法可以在 pinescript 中添加输入以允许更改条形颜色的真/假复选框
- azure - 是否可以通过 Powershell 访问 Azure 中安全中心建议的严重性?