2016-11-20 3 views
0

Я попытался решить это в течение нескольких часов. Я новичок в IOS и хочу разработать список ведра с панелью поиска. Коды не имеют проблем при компиляции, но когда я делаю ввод в строке поиска, он не будет показывать результат поиска. Я не знаю, где проблема.Почему моя панель поиска не работает?

кстати: У меня есть два подозреваемых: 1. Я попытался распечатать статус, и кажется, что searchBar никогда не активен. Как его открыть? 2. Имеет ли это какое-либо отношение к данным миссий var типа Миссии? Это то, с чем я не знаком.

Пожалуйста, смотрите следующие коды:

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

Возможно, ваша панель поиска не подключен должным образом к IBOutlet в раскадровке? –

+0

Я думаю, что я подключил его @IBOutlet слабый var searchBar: UISearchBar! Как я могу проверить его? – marshall

+0

@marshall Вы проверили метод textDidChange? – Rajat

ответ

0

Из проекта вы поделились есть проблема в методе cellForRowAtIndexPath.

заменить

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

с

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

И это будет работать нормально.

Вашего полный код будет:

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

Работает. Большое спасибо! – marshall

+1

Примите ответ, если он работает .. :) –

Смежные вопросы