2017-10-15 4 views
-1

ohne zu suchen, wenn ich eine Zelle angetippt habe, zeigt Alarm den korrekten Nachnamen an. Wenn ich jedoch einen Namen suche und auf seine Zelle tippe, wird der falsche Nachname angezeigt. In jedem Fall (ich meine, ich suche was immer) zeigt Alert immer den Nachnamen von Quuen an. Ich denke, wenn ich suche, wird das Ergebnis immer zum ersten Index meiner Tabellenansicht. Meine CodesEine Verwirrung über SearchBar und Tableview

:

import UIKit 

struct Human { 
    var name = String() 
    var surname = String() 

} 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate { 

    @IBOutlet weak var tableView: UITableView! 

    @IBOutlet weak var searchBar: UISearchBar! 

    var members = [Human]() 

    var filteredData = [String]() 

    var inSearchMode = false 

    var names = ["Oliver","Harold","John","Thea","Felicity"] 
    var surnames = ["Queen","Finch","Reese","Queen","Smoak"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 



     for i in 0..<names.count { 
      members.append(Human(name: names[i],surname: surnames[i])) 
     } 



     tableView.delegate = self 

     tableView.dataSource = self 

     searchBar.delegate = self 

     searchBar.returnKeyType = UIReturnKeyType.done 
    } 

    // MARK: - UITableViewDataSource 

    func numberOfSections(in tableView: UITableView) -> Int { 

     return 1 
    } 

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

     if inSearchMode { 

      return filteredData.count 
     } 

     return members.count 
    } 

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

     if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? DataCell { 

      let text: String! 

      if inSearchMode { 

       text = filteredData[indexPath.row] 

      } else { 

       text = members[indexPath.row].name 
      } 

      cell.congigureCell(text: text) 

      return cell 

     } else { 

      return UITableViewCell() 
     } 
    } 

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

     if searchBar.text == nil || searchBar.text == "" { 

      inSearchMode = false 

      view.endEditing(true) 

      tableView.reloadData() 

     } else { 

      inSearchMode = true 

      filteredData = names.filter { $0.lowercased().contains(searchBar.text!.lowercased()) } 

      tableView.reloadData() 

     } 
    } 
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     showAlert(title: "Surname is...", msg: members[indexPath.row].surname) 
    } 

} 

extension UIViewController { 

    func showAlert(title: String, msg: String) { 
     let alert = UIAlertController(title: title, message: msg, preferredStyle: .alert) 
     let action = UIAlertAction(title: "OK", style: .default, handler: nil) 
     alert.addAction(action) 
     self.present(alert, animated: true, completion: nil) 
    } 
} 

und Screenshots sind hier:

https://imgur.com/a/aRMNe

Schließlich, wie kann ich dieses Problem lösen?

+0

Ihr gebuchter Code ist nicht nützlich, um zu analysieren. Versuche, mehr Code zu posten, wie du Ergebnisse nach der Suche filtrierst etc., –

+0

Ich glaube nicht, dass es mit deinem Problem zusammenhängt, aber "Queen" erscheint zweimal in deinem Nachnamen-Array. – Koen

Antwort

0

Verwendung wie unten:

ändern filteredData Typ Human

var filteredData = [Human]() 

in cellForRow geändert, didSelectRowAt und textDidChange. Kommentar für die geänderten Zeilen hinzugefügt.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as? DataCell { 
     let text: String! 
     if inSearchMode { 
      text = filteredData[indexPath.row].name // changed this line only 
     } else { 
      text = members[indexPath.row].name 
     } 
     cell.textLabel?.text = text 
     return cell 
    } else { 
     return UITableViewCell() 
    } 
} 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    if searchBar.text == nil || searchBar.text == "" { 
     inSearchMode = false 
     view.endEditing(true) 
     tableView.reloadData() 
    } else { 
     inSearchMode = true 
     filteredData = members.filter { $0.name.lowercased().contains(searchBar.text!.lowercased()) } // changed this line 
     tableView.reloadData() 
    } 
} 
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if inSearchMode { 
     showAlert(title: "Surname is...", msg: filteredData[indexPath.row].surname) // added this line 
    } else { 
     showAlert(title: "Surname is...", msg: members[indexPath.row].surname) 
    } 
} 
+0

Es funktioniert richtig! Danke vielmals ! – Oliver

Verwandte Themen