【问题标题】:Thread 1: signal SIGABRT Predicate SwiftUI线程 1:signal SIGABRT Predicate SwiftUI
【发布时间】:2021-05-12 09:09:25
【问题描述】:

由于某种原因,我在谓词处分配值时收到“SGNL SGBRT”错误。这是什么原因,我该如何克服这个问题?

struct SearchView: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest var reminder: FetchedResults<CDReminder>
    @Binding var searchText: String

init(searchText: Binding<String>) {
    self._searchText = searchText
    var predicate : NSPredicate?
    predicate = NSPredicate(format: "name CONTAINS %@", searchText as! CVarArg) // SGNL SGBRT ERROR
    self._reminder = FetchRequest(
        entity: CDReminder.entity(),
        sortDescriptors: [],
        predicate: predicate
        )
}
    var body: some View {
        VStack{
            SearchBar(text: $searchText)
                .environment(\.managedObjectContext, viewContext)
            List{
                ForEach(reminder, id: \.self){ reminder in
                    DatedReminderCell(reminder: reminder, isSelected: false, onComplete: {})
                }
            }
        }
    }
}

【问题讨论】:

  • 在 searchText 中使用 searchText.wrappedValue。也不需要投射。

标签: swift swiftui predicate


【解决方案1】:

属性包装器@Binding 具有以下语义:

  • self._searchText(同$searchText)代表结构体Binding&lt;String&gt;,双向绑定。
  • self.searchText(与self._searchText.wrappedValue相同)表示包装后的字符串值。

它有点类似于 RawRepresentable String 枚举。您需要 rawValue 而不是枚举大小写。

所以正确的语法是

predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)

predicate = NSPredicate(format: "name CONTAINS %@", self._searchText.wrappedValue)

由于String 符合CVArg 协议,因此不需要(桥接)强制转换。无论如何强制施法都是错误的。

【讨论】:

  • 我根据您的回答编辑了我的代码。现在,在我的 RemindersApp.swift 文件中,我得到“线程 1:”未实现的谓词 SQL 生成:(name CONTAINS \\"\\")"" 错误
  • 如果我从我的代码中删除谓词行,那么我不会收到任何错误,并且所有提醒都在工作表视图中
  • 看来您必须过滤 空字符串 情况:if !self.searchText.isEmpty { predicate = NSPredicate(format: ...)}
  • 它解决了问题,但它没有检查我的 searchText。无论我在搜索栏中输入什么,它都会显示所有提醒
  • 在初始化searchView 时是否检查searchText 包含非空字符串?
猜你喜欢
  • 2013-07-23
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多