SwiftUI 3.0中新的.searchable修饰符与NavigationLink不兼容

4
我正在尝试使用在苹果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不起作用,它会显示原始列表。还有其他人遇到这个问题吗?

I can't upload a video but this is the search result view, as I said when I tap on one result the NavigationLink doesn't work

[编辑] 我查看了这个.searchable内的NavigationLink无法工作,但不幸的是它并没有回答我的问题,因为我的NavigationLink已经在一个NavigationView里面。


这个回答解决了你的问题吗?在.searchable中使用NavigationLink无法工作 - aheze
很遗憾,不行。因为正如你在我的代码中所看到的,NavigationLink已经位于NavigationView内部了。 - Alessio Rubicini
我也遇到了类似的问题。首先,我在我的ForEach中应用了多个过滤器。我的ForEach为数组中的每个项目呈现一个NavigationLink。NavigationLink有一个目标,我正在传递一个@State变量。当我点击应用了筛选器的下一个视图时,该视图只会将我发送回主视图,我无法访问子视图。如果我删除搜索和过滤器,则导航层次结构的行为符合我的预期。苹果公司再次令人失望。 - Andre
1个回答

3
你在这里有两个导航链接,一个在原始内容中,另一个作为闭包传递给可搜索修饰符,实际上在 searchText 更改时显示。后者不在 Navigation View 中,因此无法导航到第二个屏幕。为了实现你的期望,应该在原始内容本身中使用 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)
                }
            }
        }
    }
}

希望它能回答你的问题 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接