2015-04-29 3 views
7

Sto provando a creare una funzione di ricerca utilizzando UISearchController. Tuttavia non riesco a farlo funzionare con il mio oggetto Team. Ho iniziato creando un oggetto Team che contiene un ID, un nome e un nome breve. Quindi sto recuperando il teamData da un url e aggiungendo gli oggetti Team in un array che viene popolato in un TableView. Questa tabellaView contiene un searchController che suppone filtrare i dati, ma non succede nulla.Ricerca tramite oggetti nell'array swift

array

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

GetTeams funzionano

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 
} 

FilterData

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() 
} 

squadra Oggetti

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

Hey ho lo stesso problema. Ho seguito la tua strada, all'inizio, I Got array non può essere colmato e quindi ho aggiunto let array: NSArray. Alla fine ottengo EXC_BAD_INSTRUCTION sul filteredTableData. mi aiuti per favore. –

risposta

7

Gli oggetti nel teamArray non hanno una proprietà SELF. Non è possibile utilizzare SELF per cercare in tutte le proprietà dell'oggetto contemporaneamente. Devi dare il nome della proprietà, e se vuoi cercare in più di un altro devi aggiungere tutte quelle proprietà al predicato.

penserei che sia abbastanza per voi per cercare nella proprietà nome in questo modo:

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

Se avete bisogno di più proprietà Ti è piaciuta questa:

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

Hmm ho bisogno in qualche modo di connettere la searchBar con la funzione updateSearchResultsForSearchController –

+0

Ecco un tutorial per aiutarti a impostare correttamente SearchController, in modo che venga chiamato l'updateSearchResultsForSearchController: http://www.ioscreator.com/tutorials/add-search-table -view-tutorial-ios8-swift – pteofil

+2

Okay mi sono perso il searchUpdate. errore ora: attenzione: l'oggetto 0x7ff3aafc0e00 della classe 'Striky.Team' non implementa methodSignatureForSelector: - trouble ahead Selettore non riconosciuto - [Striky.Team valueForKey:] –

2

Puoi pubblicare la definizione del vostro oggetto della squadra, e gli eventuali sub-oggetti che esso contiene? (TeamData).

Indicare inoltre dove si prevede che il testo di ricerca venga visualizzato nell'oggetto team.

Non ho usato NSPRedicate molto, ma la mia comprensione del confronto CONTAINS è che controlla un singolo campo per vedere se contiene una sottostringa. Non penso che controllerà tutti i campi degli oggetti che stai cercando. Sembra proprio quello che ti aspetti.

+0

l'ho aggiunto ora. –

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