使用 NSPredicate 在 属性 上过滤对象数组
Filter array of objects on property with NSPredicate
我有一系列的工作室。每个工作室都有一个名为 studioName 的 属性。
我需要我的搜索字段来根据用户应用于搜索字段的工作室名称过滤工作室。
这是我当前的代码:
var studios = [Studio]()
var filteredStudios = [Studio]()
var studiosToDisplay = [Studio]()
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
print("SEARCH TEXT: \(searchText)")
if searchText == nil || searchText!.isEmpty {
studiosToDisplay = studios
self.resultTableView.reloadData()
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC
} else {
studiosToDisplay.removeAll()
let searchPredicate = NSPredicate(format: "studioName CONTAINS[c] %@", searchText!)
let array = (self.studios as NSArray).filteredArrayUsingPredicate(searchPredicate)
studiosToDisplay = array as! [Studio]
self.resultTableView.reloadData()
}
}
它现在无法正常工作。它会过滤,但无论我在搜索字段中输入什么,我每次都会留下相同的工作室。
我想我需要让谓词知道,它必须每次都查看数组中的单个对象。但我就是不知道怎么办。
我尝试在格式中添加 "ANY",但这会使我的应用程序崩溃。
这不必要地复杂。这里不需要NSPredicate
。
var studios = [Studio]()
var filteredStudios = [Studio]()
var studiosToDisplay = [Studio]()
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
print("SEARCH TEXT: \(searchText)")
if let searchText = searchText, !searchText.isEmpty {
studiosToDisplay = studios.filter{ [=10=].studioName.contains(searchText) }
}
else {
studiosToDisplay = studios
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC
}
self.resultTableView.reloadData()
}
感谢@Alexander ..这是我最终使用的代码:
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
if let searchText = searchText {
if !searchText.isEmpty {
self.studiosToDisplay = self.studios.filter { [=10=].studioName!.containsString(searchText) }
for studio in self.studiosToDisplay {
print("\(studio.studioName!)")
}
}
else {
self.studiosToDisplay = self.studios
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) // Calls SearchVC
}
}
self.resultTableView.reloadData()
}
我想通了,我以前的代码,使用 NSPredicate 实际上是有用的——我只是在我的表视图中显示了错误的数组。糟糕。但现在它可以工作了,我坚持使用更简单的代码。不知道为什么我没有想到使用 $0 函数 :) .. 无论如何,谢谢!
我有一系列的工作室。每个工作室都有一个名为 studioName 的 属性。
我需要我的搜索字段来根据用户应用于搜索字段的工作室名称过滤工作室。
这是我当前的代码:
var studios = [Studio]()
var filteredStudios = [Studio]()
var studiosToDisplay = [Studio]()
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
print("SEARCH TEXT: \(searchText)")
if searchText == nil || searchText!.isEmpty {
studiosToDisplay = studios
self.resultTableView.reloadData()
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC
} else {
studiosToDisplay.removeAll()
let searchPredicate = NSPredicate(format: "studioName CONTAINS[c] %@", searchText!)
let array = (self.studios as NSArray).filteredArrayUsingPredicate(searchPredicate)
studiosToDisplay = array as! [Studio]
self.resultTableView.reloadData()
}
}
它现在无法正常工作。它会过滤,但无论我在搜索字段中输入什么,我每次都会留下相同的工作室。
我想我需要让谓词知道,它必须每次都查看数组中的单个对象。但我就是不知道怎么办。 我尝试在格式中添加 "ANY",但这会使我的应用程序崩溃。
这不必要地复杂。这里不需要NSPredicate
。
var studios = [Studio]()
var filteredStudios = [Studio]()
var studiosToDisplay = [Studio]()
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
print("SEARCH TEXT: \(searchText)")
if let searchText = searchText, !searchText.isEmpty {
studiosToDisplay = studios.filter{ [=10=].studioName.contains(searchText) }
}
else {
studiosToDisplay = studios
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC
}
self.resultTableView.reloadData()
}
感谢@Alexander ..这是我最终使用的代码:
func updateSearchResultsForSearchController(searchController: UISearchController) {
let searchText = searchController.searchBar.text
if let searchText = searchText {
if !searchText.isEmpty {
self.studiosToDisplay = self.studios.filter { [=10=].studioName!.containsString(searchText) }
for studio in self.studiosToDisplay {
print("\(studio.studioName!)")
}
}
else {
self.studiosToDisplay = self.studios
NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) // Calls SearchVC
}
}
self.resultTableView.reloadData()
}
我想通了,我以前的代码,使用 NSPredicate 实际上是有用的——我只是在我的表视图中显示了错误的数组。糟糕。但现在它可以工作了,我坚持使用更简单的代码。不知道为什么我没有想到使用 $0 函数 :) .. 无论如何,谢谢!