尝试实现搜索栏时出现 Swift 错误

我正在尝试在我的代码中实现一个搜索栏,但由于某种原因,我收到错误 Failed to produce diagnostic for expression; please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the project,这仅在实现 if 语句但与打印语句一起正常工作时发生。 If 语句有问题还是我使用错误?我希望它的工作方式是显示所有核心数据条目,除非在搜索栏中输入了某些内容(我假设在 If 语句中使用 or 语句来检查是否搜索 == "")以及是否输入了某些内容搜索栏只显示名称属性包含搜索栏显示内容的条目。我正在使用 Xcode 12.5。任何帮助将不胜感激。

import SwiftUI

struct customers: View {
    @FetchRequest(entity: Customer.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Customer.name,ascending: true)]) var customered: FetchedResults<Customer>


@Environment(\.managedobjectcontext) var moc

@State var search = String()
    
var body: some View {
    TextField("Search",text: $search)
    VStack{
        HStack{
            Text("Name")
        }
        Group{
            List(customered) {that in 
               if(that.name?.lowercased().contains(search.lowercased())){
                Text(that.name ?? "unknown")
                    .onTapGesture {
                        if(that.shown){
                            that.shown = false
                        }else{
                            for shownVar in customered{   
                                print(shownVar.name?.lowercased().contains(search.lowercased()))
                            }
                        }
                    }
                }
            }
        }
    }
}

附言回想一下,这也需要很长时间来编译和加载,所以有没有更快更好的方法,因为有一次它不会构建,因为它花了太长时间并说要分解代码(这是一个更短的版本实际代码)。

mm6yuz 回答:尝试实现搜索栏时出现 Swift 错误

我认为问题是“that.name”可以为零,因此编译器无法理解该做什么。尝试这样的事情来实现你想要的:

                if search.isEmpty {
                    Text(that.name ?? "unknown")
                        .onTapGesture {
                            // ....
                        }
                } else {
                    if ( (that.name ?? "").lowercased().contains(search.lowercased())) {
                        Text(that.name ?? "unknown")
                            .onTapGesture {
                                // ....
                            }
                    }
                }

编辑:

为了简洁起见,您可以使用以下内容:

struct CustomersView: View {
    @FetchRequest(entity: Customer.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Customer.name,ascending: true)]) var customered: FetchedResults<Customer>

    @Environment(\.managedObjectContext) var moc

    @State var search = String()

    var body: some View {
        TextField("Search",text: $search)
        VStack{
            HStack{
                Text("Name")
            }
            Group{
                List($customered,id: \.id) { $that in
                    if search.isEmpty {
                        TapableTextView(cust: $that)
                    } else {
                        if ( (that.name ?? "").lowercased().contains(search.lowercased())) {
                            TapableTextView(cust: $that)
                        }
                    }
                }
            }
        }
    }
}
    

struct TapableTextView: View {
    @Binding var cust: customer
    
    var body: some View {
        Text(cust.name ?? "unknown")
            .frame(maxWidth: .infinity)
            .contentShape(Rectangle())
            .onTapGesture {
                    if(cust.shown){
                        cust.shown = false
                    }
            }
    }
}

编辑 2:我刚刚注意到您使用的是 Xcode 12.5,在这种情况下,请尝试以下操作:

struct CustomersView: View {
    @FetchRequest(entity: Customer.entity(),ascending: true)]) var customered: FetchedResults<Customer>
    
    @Environment(\.managedObjectContext) var moc
    
    @State var search = String()
    
    private func tapableText(_ ndx: Int) -> some View {
        Text(customered[ndx].name ?? "unknown")
            .frame(maxWidth: .infinity)
            .contentShape(Rectangle())
            .onTapGesture {
                if(customered[ndx].shown){
                    customered[ndx].shown = false
                }
                print( "tapped on " + (customered[ndx].name ?? "unknown") )
            }
    }
    
    var body: some View {
        TextField("Search",text: $search)
        VStack{
            HStack{
                Text("Name")
            }
            Group{
                List(customered.indices,id: \.self) { ndx in
                    if search.isEmpty {
                        tapableText(ndx)
                    } else {
                        if ( (customered[ndx].name ?? "").lowercased().contains(search.lowercased())) {
                            tapableText(ndx)
                        }
                    }
                }
            }
        }
    }
}
本文链接:https://www.f2er.com/13676.html

大家都在问