2017-04-23 85 views
2

我有一组工作室。每个工作室都有一个名为studioName的属性。使用NSPredicate过滤属性上的对象数组

我需要我的searchfield根据用户对搜索字段应用的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() 
    } 
} 

它只是不工作怀特,现在..它过滤,但我结束了同一个工作室,每次离开,不管我放在searchfield。

我想我需要让谓词知道,它必须每次都查看数组中的单个对象。但我不知道如何。 我试图在格式中添加“ANY”,但这会导致我的应用崩溃。

+0

你应该正确地标记你的问题,因为它似乎你正在使用Swift 2(我建议更新你的Xcode到APP商店提供的最新Xcode) –

+0

附注:使用'searchText == nil'检查nil ,然后强制解包('searchText!')是非常糟糕的练习 – Alexander

回答

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

由于@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功能:)无论如何,谢谢!

+0

您可以使用guard语句绑定'searchText',而不需要额外的缩进级别 – Alexander

相关问题