使用NSPredicate过滤属性上的对象数组

时间:2017-04-23 13:38:16

标签: arrays swift filtering nspredicate

我有一系列的工作室。每个工作室都有一个名为studioName的属性。

我需要我的搜索字段来过滤工作室,基于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"在格式中,但崩溃我的应用程序。

2 个答案:

答案 0 :(得分:7)

这是不必要的复杂。这里不需要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{ $0.studioName.contains(searchText) }
    }
    else {
        studiosToDisplay = studios
        NSNotificationCenter.defaultCenter().postNotificationName("showResultsBeforeSearchingNotification", object: nil) //Calls SearchVC
    }

    self.resultTableView.reloadData()
}

答案 1 :(得分:1)

感谢@Alexander ..这是我最终使用的代码:

func updateSearchResultsForSearchController(searchController: UISearchController) {

    let searchText = searchController.searchBar.text

    if let searchText = searchText {
        if !searchText.isEmpty {
            self.studiosToDisplay = self.studios.filter { $0.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实际上是功能性的 - 我只是在我的tableview中呈现错误的数组..糟糕..但现在它有效,我坚持使用更简单的代码。不知道为什么我没想到使用$ 0-function :) ..无论如何,谢谢!