2015-04-29 153 views
7

我試圖使用UISearchController創建搜索功能。然而,我似乎無法使它與我的團隊對象一起工作。我已經開始創建一個Team Object,其中包含一個id,名稱和短名稱。然後,我從URL中檢索teamData,並將Team Objects添加到填充到tableView中的數組中。這個tableView包含一個searchController,它假設過濾數據,但沒有任何反應。快速搜索數組中的對象

陣列

var teamArray = Array<Team>() 
var filteredTableData = [String]() 

GetTeams起作用

func getTeams(url: String) { 

    isApiCalling = true 
    request(.GET, url, parameters: nil) 
     .response { (request, response, data, error) in 
      if error == nil { 

       let data: AnyObject = data! 
       let jsonArray = JSON(data: data as! NSData) 
       for (key: String, subJson: JSON) in jsonArray { 



         // Create an object and parse your JSON one by one to append it to your array 
         var newTeamObject = Team(id: subJson["id"].intValue, name: subJson["name"].stringValue, shortname: subJson["shortname"].stringValue) 


         self.teamArray.append(newTeamObject) 


       } 


       self.isApiCalling = false 
       self.tableView.reloadData() 
       self.refreshControl?.endRefreshing() 

      } 
    } 

} 

的cellForRowAtIndexPath

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("teamCell", forIndexPath: indexPath) as! TeamCell 


    cell.textLabel?.font = UIFont(name: "HelveticaNeue-Light", size: 20) 
    cell.textLabel?.text = self.teamArray[indexPath.row].name as String 



    if (self.cellSelected.containsObject(indexPath)) { 
     cell.accessoryView = cell.accessoryCheck 
    } else { 
     cell.accessoryView = cell.accessoryUncheck 
    } 


    return cell 
} 

篩選數據

func updateSearchResultsForSearchController(searchController: UISearchController) 
{ 
    filteredTableData.removeAll(keepCapacity: false) 

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text) 
    let array = (teamArray as NSArray).filteredArrayUsingPredicate(searchPredicate) 
    filteredTableData = array as! [String] 

    self.tableView.reloadData() 
} 

團隊對象

class Team{ 
    var id: Int! 
    var name: NSString! 
    var shortname: NSString! 


init(id: Int, name:NSString, shortname: NSString) { 
    self.id = id 
    self.name = name 
    self.shortname = shortname 

} 

} 
+0

嘿,我有一樣的問題。我遵循你的方式,起初,我得到的數組不能被橋接,然後我添加了讓數組:NSArray。最後,我在filteredTableData上獲得了EXC_BAD_INSTRUCTION。請幫幫我。 –

回答

7

teamArray中的對象沒有SELF屬性。您不能使用SELF一次搜索對象的所有屬性。您必須提供該屬性的名稱,如果要搜索多個屬性,則必須將所有這些屬性添加到謂詞中。

我會認爲這是足以讓你的名字屬性進行搜索,像這樣:如果你需要更多的屬性你喜歡這款

let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@", searchController.searchBar.text) 

let searchPredicate = NSPredicate(format: "name CONTAINS[c] %@ OR shortname CONTAINS[c] %@", searchController.searchBar.text, searchController.searchBar.text) 
+0

嗯,我需要以某種方式連接searchBar與updateSearchResultsForSearchController函數 –

+0

這裏是一個教程,以幫助您正確設置SearchController,以便調用updateSearchResultsForSearchController:http://www.ioscreator.com/tutorials/add-search-table -view-tutorial-ios8-swift – pteofil

+2

好吧,我錯過了searchUpdate。錯誤現在:警告:類'Striky.Team'的對象0x7ff3aafc0e00未實現methodSignatureForSelector: - 提前出現故障 無法識別的選擇器 - [Striky.Team valueForKey:] –

2

你可以發佈你的團隊對象的定義,以及所包含的所有子對象? (TeamData)。

此外還指出您希望搜索文本出現在您的團隊對象中的位置。

我還沒有使用NSPRedicate很多,但我對CONTAINS比較的理解是,它檢查單個字段以查看它是否包含子字符串。我不認爲它會檢查您正在搜索的對象的所有字段。這看起來像你期待的。

+0

我已經添加了。 –

2
let searchPredicate = NSPredicate(format: "name contains[c] %@", searchWord) 
self.filteredArray = self.array.filteredArrayUsingPredicate(searchPredicate)