线程1:信号SIGABRT谓词SwiftUI
由于某种原因,我得到了“SGNL SGBRT”错误,在这里我在谓词处赋值。原因是什么?我如何克服这个问题线程1:信号SIGABRT谓词SwiftUI,swift,swiftui,predicate,Swift,Swiftui,Predicate,由于某种原因,我得到了“SGNL SGBRT”错误,在这里我在谓词处赋值。原因是什么?我如何克服这个问题 struct SearchView: View { @Environment(\.managedObjectContext) private var viewContext @FetchRequest var reminder: FetchedResults<CDReminder> @Binding var searchText: String init
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: {})
}
}
}
}
}
struct SearchView:View{
@环境(\.managedObjectContext)私有变量viewContext
@FetchRequest变量提醒:FetchedResults
@绑定var searchText:String
init(searchText:Binding){
self.\u searchText=searchText
变量谓词:NSPredicate?
谓词=NSPredicate(格式:“名称包含%@”,搜索文本为!CVarArg)//SGNL SGBRT错误
self.\u提醒=FetchRequest(
实体:CDReminder.entity(),
sortDescriptors:[],
谓词:谓词
)
}
var body:一些观点{
VStack{
搜索栏(文本:$searchText)
.environment(\.managedObjectContext,viewContext)
名单{
ForEach(提醒,id:\.self){中的提醒
DatedReminderCell(提醒:提醒,isSelected:false,onComplete:{})
}
}
}
}
}
属性包装器@Binding
具有以下语义:
(与self.\u searchText
相同)表示结构$searchText
,即双向绑定绑定
(与self.searchText
)表示包装的字符串值self相同。\u searchText.wrappedValue
rawValue
,而不是枚举大小写
所以正确的语法是
predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)
或
由于
String
符合CVArg
协议,因此不需要进行桥接转换。强制转换无论如何都是错误的。属性包装器@Binding
具有以下语义:
(与self.\u searchText
相同)表示结构$searchText
,即双向绑定绑定
(与self.searchText
)表示包装的字符串值self相同。\u searchText.wrappedValue
rawValue
,而不是枚举大小写
所以正确的语法是
predicate = NSPredicate(format: "name CONTAINS %@", self.searchText)
或
由于
String
符合CVArg
协议,因此不需要进行桥接转换。强制转换无论如何都是错误的。使用searchText.wrappedValue代替searchText。也不需要强制转换。使用searchText.wrappedValue代替searchText。也不需要施放。我根据你的答案编辑了我的代码。现在,在我的rementersapp.swift文件中,我得到了“Thread 1:”未实现的谓词SQL生成:(name包含\“\”)”错误如果我从代码中删除谓词行,那么我不会得到任何错误,所有的提醒都出现在一个工作表视图中,看起来您必须过滤空字符串大小写:if!self.searchText.isEmpty{predicate=NSPredicate(format:…)}
它解决了问题,但没有检查我的searchText。无论我在SearchBarId中键入什么,它都会显示所有提醒。当初始化searchView
时,请检查searchText
是否包含非空字符串?我根据您的答案编辑了我的代码。现在,在我的rementersapp.swift文件中,我得到了“Thread 1:”未实现的谓词SQL生成:(name包含\“\”)”错误如果我从代码中删除谓词行,那么我不会得到任何错误,所有的提醒都出现在一个工作表视图中,看起来您必须过滤空字符串大小写:if!self.searchText.isEmpty{predicate=NSPredicate(format:…)}
它解决了问题,但没有检查我的searchText。它显示了我在SearchBarID中键入的所有提醒。在初始化searchView
时,是否检查searchText
是否包含非空字符串?