为什么我的搜索栏不起作用?

时间:2016-11-20 05:24:02

标签: ios swift searchbar

我试图解决这个问题几个小时。我是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

1 个答案:

答案 0 :(得分: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
}