2016-11-20 5 views
0

Ich habe versucht, dies für ein paar Stunden zu lösen. Ich bin ein Neuling in IOS und möchte eine Bucket-Liste mit einer Suchleiste entwickeln. Die Codes haben kein Problem beim Kompilieren, aber wenn ich Eingaben in der Suchleiste mache, werden keine Suchergebnisse angezeigt. Ich weiß nicht, wo das Problem liegt.Warum funktioniert meine Suchleiste nicht?

BTW: Ich habe zwei Verdächtige: 1. Ich habe versucht, den Status zu drucken, und es scheint, dass die searchBar nie aktiv ist. Wie man es öffnet? 2. Hat es irgendetwas mit den Daten von var missions zu tun? type als Mission? Es ist etwas, mit dem ich nicht vertraut bin.

Bitte beachten Sie die folgenden Codes:

import UIKit 

class BucketListViewController:UITableViewController, MissionDetailsViewControllerDelegate, MissionEditViewControllerDelegate, UISearchBarDelegate{ 

    var searchController = UISearchController(searchResultsController: nil) 
    @IBOutlet weak var searchBar: UISearchBar! 

    var searchActive : Bool = false 
    var filtered:[String] = [] 
    var missions:[String] = ["Sky diving", "Live in Hawaii"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     searchBar.delegate = self 
     self.searchDisplayController!.searchResultsTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "MyCell") 
    } 

    func searchBarTextDidBeginEditing(searchBar: UISearchBar) { 
     searchActive = true; 
    } 

    func searchBarTextDidEndEditing(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar) { 
     searchActive = false; 
    } 

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

     filtered = missions.filter({ (text) -> Bool in 
      let tmp: NSString = text 
      let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch) 
      return range.location != NSNotFound 
     }) 
     if(filtered.count == 0){ 
      searchActive = false; 
     } else { 
      searchActive = true; 
     } 
     self.tableView.reloadData() 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     // dequeue the cell from our storyboard 
     let cell = tableView.dequeueReusableCellWithIdentifier("MyCell")! 
     if(searchActive){ 
      print("search active!") 
      cell.textLabel?.text = filtered[indexPath.row] 
     } else { 
      cell.textLabel?.text = missions[indexPath.row] 
     } 
     return cell 
    } 


    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     if(searchActive){ 
      return filtered.count 
     } else { 
      return missions.count 
     } 
    } 



    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "AddNewMission" { 
      let navigationController = segue.destinationViewController as! UINavigationController 
      let controller = navigationController.topViewController as! MissionDetailsViewController 
      controller.delegate = self 
     } 
     if segue.identifier == "EditMission" { 
      let navigationController = segue.destinationViewController as! UINavigationController 
      let controller = navigationController.topViewController as! MissionEditViewController 
      controller.delegate = self 
     } 
    } 


    func missionDetailsViewController(controller: MissionDetailsViewController, didFinishAddingMission mission: String) { 
     dismissViewControllerAnimated(true, completion: nil) 
     missions.append(mission) 
     tableView.reloadData()} 

    func missionEditViewController(controller: MissionEditViewController, didFinishEditingMission mission: String, atIndexPath indexPath: Int) { 
     dismissViewControllerAnimated(true, completion: nil) 
     missions[indexPath] = mission 
     tableView.reloadData() 

    } 
} 

PICTURE ON WORKING ERROR OF SEARCH BAR

+0

Vielleicht Ihre Suchleiste ist nicht richtig an den IBOutlet in Ihrem Storyboard angeschlossen? –

+0

Ich denke, ich habe es angeschlossen von @IBOutlet schwach var searchBar: UISearchBar! Wie kann ich nachsehen? – marshall

+0

@Marshall haben Sie überprüft, 'TextDidChange' Methode wird aufgerufen? – Rajat

Antwort

0

Aus dem Projekt, das Sie dort geteilt haben ein Problem in Ihrer cellForRowAtIndexPath Methode.

cell.textLabel?.text = filtered[indexPath.row] as? String 

mit

cell.textLabel?.text = filtered[indexPath.row].details 

ersetzen Und es wird gut funktionieren.

Ihr vollständiger Code wird sein:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // dequeue the cell from our storyboard 
    let cell = tableView.dequeueReusableCellWithIdentifier("MissionCell")! 
    // if the cell has a text label, set it to the model that is corresponding to the row in array 
    if(searchActive){ 
     print("search active!") 
     cell.textLabel?.text = filtered[indexPath.row].details 
    } else { 
     cell.textLabel?.text = missions[indexPath.row].details 
    } 
    return cell 
} 
+0

Es funktioniert. Vielen Dank! – marshall

+1

Akzeptieren Sie die Antwort, wenn es funktioniert .. :) –