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

标签 ios swift searchbar

我已经尝试解决这个问题几个小时了。我是 IOS 的新手,想开发一个带有搜索栏的愿望 list 。代码在编译时没有问题,但是当我在搜索栏中输入时,它不会显示任何搜索结果。我不知道问题出在哪里。

顺便说一句:我有两个嫌疑人: 1.我尝试打印状态,但搜索栏似乎从未处于事件状态。如何打开它? 2. 与var Mission的数据有关系吗 输入任务?这是我不熟悉的事情。

请参阅以下代码:

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

最佳答案

从您共享的项目中,您的 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
}

关于ios - 为什么我的搜索栏不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40700996/

相关文章:

iOS - 搜索栏,错误

iphone - 未转义控制字符导致 JSON 解析器间歇性失败

swift - 找到旋转的 SKSpriteNode 的精确帧

ios - UISearchController 中的 SearchBar 委托(delegate)不起作用

ios - 通过 KeyChain 保存和检索值

ios - 如何链接 Observables 并为错误处理创建一个公共(public)位置

ios - 当 uisearchDisplayController 激活时,导航栏中的搜索栏动画出现问题

ios - 获取异常 'NSInvalidArgumentException',原因 : '-[__NSCFString stringValue]

iphone - AppStore,我有一个应用正在审核中,我可以将其由自动发布改为手动发布吗?

ios - 自定义 uibarbutton 也会更改电子邮件表单中的按钮