2017-04-05 4 views
0

Ich lade meine plist in eine TableView und es geht alles in Ordnung, aber jetzt, wenn ich etwas suche, berücksichtigt es nicht den ersten Buchstaben. Unten sehen Sie die directory.plist und meine Main.storyboardNicht den ersten Buchstaben suchen

plist and storyboard

So laden die plist richtig sehen habe ich den folgenden Code auf meinem didFinishLaunchingWithOptions:

class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
     if let url = Bundle.main.url(forResource: "directory", withExtension: "plist"), let array = NSArray(contentsOf: url) as? [[String:Any]] { 
      Shared.instance.employees = array.map{Employee(dictionary: $0)} 
     } 
     return true 
} 

ich helfen mir auch eine Struktur haben laden alle meine Sachen:

struct EmployeeDetails { 
    let functionary: String 
    let imageFace: String 
    let phone: String 

    init(dictionary: [String: Any]) { 
     self.functionary = (dictionary["Functionary"] as? String) ?? "" 
     self.imageFace = (dictionary["ImageFace"] as? String) ?? "" 
     self.phone = (dictionary["Phone"] as? String) ?? "" 
    } 
} 
struct Employee { 
    let position: String 
    let name: String 
    let details: [EmployeeDetails] // [String:Any] 

    init(dictionary: [String: Any]) { 
     self.position = (dictionary["Position"] as? String) ?? "" 
     self.name = (dictionary["Name"] as? String) ?? "" 

     let t = (dictionary["Details"] as? [Any]) ?? [] 
     self.details = t.map({EmployeeDetails(dictionary: $0 as! [String : Any])}) 
    } 
} 

struct Shared { 
    static var instance = Shared() 
    var employees: [Employee] = [] 
} 

Bis hier gut läuft alles! Jetzt wurde ich Probleme, als ich versuchte, eine Suche einzufügen, werfen Sie einen Blick, was ich bisher tat:

class Page1: UITableViewController, UISearchBarDelegate { 

    @IBOutlet weak var searchBar: UISearchBar! 

    var employeesSearching = [Employee]() 
    var isSearching : Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.searchBar.delegate = self 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if self.isSearching == true { 
      return self.employeesSearching.count 
     } else { 
      return Shared.instance.employees.count 
     } 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell1 
     let employee = Shared.instance.employees[indexPath.row] 

     if self.isSearching == true { 
      cell.nameLabel.text = self.employeesSearching[indexPath.row].name 
      cell.positionLabel.text = self.employeesSearching[indexPath.row].position 
     } else { 
      cell.nameLabel.text = employee.name 
      cell.positionLabel.text = employee.position 
     } 
     return cell 
    } 

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
     if self.searchBar.text!.isEmpty { 
      self.isSearching = false 
      self.tableView.reloadData() 
     } else { 
      self.isSearching = true 
      self.employeesSearching.removeAll(keepingCapacity: false) 
      for i in 0..<Shared.instance.employees.count { 
       let listItem : Employee = Shared.instance.employees[i] 
       if listItem.name.range(of: self.searchBar.text!.lowercased()) != nil { 
        self.employeesSearching.append(listItem) 
       } 
      } 
      self.tableView.reloadData() 
     } 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destination = segue.destination as? Page2, 
      let indexPath = tableView.indexPathForSelectedRow { 
      destination.newPage = Shared.instance.employees[indexPath.row] 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

Ich bin auf dem ersten Brief von meinen Recherchen Probleme haben. Werfen Sie einen Blick:

enter image description here enter image description here

Antwort

2

Das Problem ist, diese Zeile:

if listItem.name.range(of: self.searchBar.text!.lowercased()) != nil { 

Sie sind für die Kleinversion des Suchtextes in der regulären Text des Mitarbeiternamen suchen.

Der Text "John Smith" enthält nicht den Suchtext "j". Aber es enthält den Suchtext "ohn".

if listItem.name.lowercased().range(of: self.searchBar.text!.lowercased()) != nil { 

Dies vergleicht nun die Kleine Version sowohl den Namen des Mitarbeiters und den Suchtextes: zu

Die schnellen Lösung ist, dass die Code-Zeile zu ändern. Jetzt wird es übereinstimmen, da "John Smith" "j" enthält.

BTW - es ist ineffizient, den Suchtext immer und immer wieder Kleinbuchstaben. Und es gibt eine bessere Möglichkeit, den Schleifencode zu schreiben. Ich würde es ändern:

self.employeesSearching.removeAll(keepingCapacity: false) 
let searchText = self.searchBar.text!.lowercased() 
for employee in Shared.instance.employees { 
    if employee.name.lowercased().range(of: searchText) != nil { 
     self.employeesSearching.append(employee) 
    } 
} 

Und noch einfacher Ansatz ist, dass Code mit zu ersetzen:

let searchText = self.searchBar.text!.lowercased() 
self.employeesSearching = Shared.instance.employees.filter { $0.name.lowercased().range(of: searchText) != nil 
} 

Um entweder den Text im Namen zu suchen oder die Position, die einfach den Vergleichsausdruck aktualisieren:

if employee.name.lowercased().range(of: searchText) != nil || employee.position.lowercased().range(of: searchText) != nil { 

Machen Sie eine ähnliche Änderung, wenn Sie die filter verwenden.

+0

Großartig! Es ist getan, jetzt nur für das Wissen. Was soll ich ändern, um nicht nur den Namen, sondern auch die Position zu suchen? –

+1

Siehe meine aktualisierte Antwort. Das sind ziemlich einfache Dinge. Ich bitte Sie, Zeit zu verbringen, um das Buch "The Swift Programming Language" von Apple zu lesen. Je mehr du die Sprache verstehst, desto besser wirst du sein. – rmaddy

+0

Ich bin dabei, es zu tun, als Sie so viel für den Unterricht !! –

Verwandte Themen