我试图删除用户选择的图书,并且我在NSPredicate线上获得了EXC_BAD_ACCESS。谁能告诉我我哪里做错了?
func deleteSelectedBook() {
// Create Fetch Request
let fetchRequest = NSFetchRequest(entityName: "BookEntity")
// Create array string for predicate
var titleCollection:[String] = []
var formatString:String = ""
if let selectedCellCollection = self.tableView.indexPathsForSelectedRows {
for index in selectedCellCollection{
if (!formatString.isEmpty) {
formatString += " OR "
}
var temp = (self.tableView.cellForRowAtIndexPath(index)?.textLabel?.text)!
titleCollection.append(temp)
formatString += " title = %@ "
}
}
// Configure Fetch Request
fetchRequest.predicate = NSPredicate(format: formatString, titleCollection)
......
答案 0 :(得分:1)
对于两个(作为示例)所选项目,formatString
将是
"title = %@ OR title = %@"
需要两个参数,但在
中NSPredicate(format: formatString, titleCollection)
只给出了一个参数。您可以使用
修复此问题NSPredicate(format: formatString, argumentArray: titleCollection)
其中titleCollection
现在提供了所有参数
谓词创造。但是更好更简单的解决方案是
NSPredicate(format: "title IN %@", titleCollection)
使用固定的谓词格式字符串。
通常应该避免使用字符串操作来创建
谓词格式字符串。在这种情况下,一个简单的谓词服务
同样的目的。在更复杂的情况下,NSCompoundPredicate
可用于动态构建谓词。