2017-06-26 1 views
0

Ich möchte das Suchergebnis eines SearchBar in einem TableView anzeigen und ich weiß nicht wie.Wie man Daten in der Tabellenansicht lädt Ergebnis der Suchleiste swift

enter image description here

wenn ich ein Ziel im TextField- geben, ist alles ganz gut funktioniert, aber wenn ich in der SearchBar Typ funktioniert nicht:

enter image description here

Hier ist, wie ein nennen func zur Suche in [String]:

extension ViewController: UITextFieldDelegate { 


public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    let substring = (textField.text! as NSString).replacingCharacters(in: range, with: string) 

    DestinoP.searchDestinos(substring) 

    return true 

}} 

hier ist, wie das Ergebnis zeigen:

extension ViewController: UITableViewDataSource { 

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell 
    let index = indexPath.row as Int 

    isSearching = true // this is just for SearchBar 
    if isSearching { 
     if let str = autoCompleteDestino[index].desDestino { 
      cell.textLabel?.text = str 
     } 
    } 

    return cell 
}} 

Erweiterung Viewcontroller: UITableViewDelegate {

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    if isSearching { // this is just for SearchBar 
     return autoCompleteDestino.count 
    } 

    return autoCompleteDestino.count 

} 

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let selectedCell: UITableViewCell = tableView.cellForRow(at: indexPath)! 

    destinoSearch.text = selectedCell.textLabel!.text! 
    busquedaDestinosText.text = selectedCell.textLabel!.text! 

}} 

das ist, wie ich versuche, das Ergebnis zu zeigen, wenn ich in der SearchBar Typ:

extension ViewController: UISearchBarDelegate { 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    let stringOfUser = (busquedaDestinosText.text) 

    DestinoP.searchDestinos(stringOfUser!) 

    if destinoSearch.text == "" { 
     isSearching = false 
     view.endEditing(true) 
     tableView.reloadData() 
     print(isSearching) 
    } else { 
     isSearching = true 
     print(isSearching) 
     print(autoCompleteDestino) 
    } 

}} 

kann mir helfen?

Antwort

0

mit zu starten, sollten Sie zwei Arrays in Ihrer Klasse haben original und filtered

var originalData: [String]! 
var filteredData: [String]! 

eine searchController in Ihrer Klasse hinzufügen

let searchController = UISearchController(searchResultsController: nil) 

Richten Sie Ihre searchController und die searchBar als tableView 'hinzufügen s Kopfzeile

searchController.dimsBackgroundDuringPresentation = false 
searchController.searchBar.delegate = self 
searchController.searchBar.placeholder = "Search" 
searchController.searchBar.sizeToFit() 
searchController.hidesNavigationBarDuringPresentation = false 

tblView.tableHeaderView = searchController.searchBar 

Implementieren der searchBar 's delegate Methoden

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { 
    searchController.searchBar.text = "" 
    tblView.reloadData() 
} 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    let searchString = searchController.searchBar.text 
    filteredData = originalData.filter({ (item) -> Bool in 
     let value: NSString = item as NSString 
     return (value.range(of: searchString!, options: .caseInsensitive).location != NSNotFound) 
    }) 
    tblView.reloadData() 
} 

Schließlich Ihre tableView' s delegate Methoden so etwas wie dieses

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchController.isActive == true && searchController.searchBar.text != "" { 
     return filteredData.count 
    } 
    return originalData.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if searchController.isActive == true && searchController.searchBar.text != "" { 
     //RETURN CELLS CREATED FROM FILTERED DATA 
    } 
    //RETURN CELLS CREATED FROM ORIGINAL DATA 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if searchController.isActive == true && searchController.searchBar.text != "" { 
     //HANDLE ROW SELECTION FROM FILTERED DATA 
    } 
    //HANDLE ROW SELECTION FROM ORIGINAL DATA 
} 
+0

Hallo Malik..danke! aber in diesem Fall füge ich die Suchleiste in das Storyboard @IBOutlet schwach var destinoSearch: UISearchBar! (nicht programmatisch). Und der Weg, um die "gefilterten Daten oder AutoCompleteDestino in meinem Fall" zu zeigen, ist dies: wenn let str = autoCompleteDestino [index] .desDestino { cell.textLabel? .text = str } Wie zeigen Sie die AutoCompleteDestino bei der Eingabe in der SearchBar? – xhinoda

+1

Sie müssen noch die searchBar 'delegate' Methoden einbinden. Diese Methoden wiederum filtern die Daten aus und laden 'tableView' erneut – Malik

0

OK aussehen ... so dass ich mein Problem lösen. @Malik ist offen meine Meinung! (Dank dafür!) Schließlich habe ich die SearchBar programmatisch durch dieses tun:

let searchController = UISearchController(searchResultsController: nil) 
    searchController.dimsBackgroundDuringPresentation = false 
    searchController.searchBar.delegate = self 
    searchController.searchBar.placeholder = "Buscar Destinos" 
    searchController.searchBar.sizeToFit() 
    searchController.hidesNavigationBarDuringPresentation = false 

und zeigen in meinem Tableview:

tableView.tableHeaderView = searchController.searchBar 

Ich benutze UISearchBarDelegate:

                   `extension ViewController: UISearchBarDelegate { 
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 

    let stringOfUser = (searchController.searchBar.text!) 

    DestinoP.searchDestinos(stringOfUser) 

}} 

das Ergebnis in der Tableview zeigen:

extension ViewController: UITableViewDataSource { 
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as UITableViewCell 
    let index = indexPath.row as Int 

     if let str = autoCompleteDestino[index].desDestino { 
      cell.textLabel?.text = str 
     } 

    return cell 
}} 

Und reload von Tableview:

func mostarResultados(ArrayResultados: [Destinos]) { 

    autoCompleteDestino = ArrayResultados 
    tableView.reloadData() 
} 

Dank!

Verwandte Themen