搜索栏在swift 3中不起作用。无法转换类型(_)的值 - > Bool对预期参数类型NSPredicate

时间:2017-04-28 12:00:36

标签: ios swift3 xcode8 searchbar

它不断显示错误:无法转换类型(_)的值 - > Bool对预期参数类型NSPredicate 在线:

filtered = OrdersArray.filter(using: { (text) -> Bool in
            let tmp: NSString = text
            let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)

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

        filtered = OrdersArray.filter(using: { (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()
    }

UISearchBarDelegateUISearchDisplayDelegate个代表都已标记 searchBarTextDidBeginEditingsearchBarTextDidEndEditingsearchBarCancelButtonClickedsearchBarSearchButtonClicked 函数是写的 请告诉我如何在NSMutableArray中搜索数据。

这是我的阵列。

{
orders =     (
            {
        "created_at" = "2017-05-01 04:49:17";
        id = 591;
        "order_status" = CONFIRMED;
        "pickup_code" = 4356219;
        store =             {
            address1 = "**********";
            city = "**********";
            description = "*************";
            logo = "fghdshdx.png";
            name = "*******";
            "postal_code" = 110006;
            storeTotal = "20.00";
            "store_id" = 4;
            "tin_number" = M1O2R3E4MORE;
        };
        total = "20.00";
        "updated_at" = "2017-05-01 04:49:20";
        "user_address_id" = "<null>";
        "user_id" = 5372;
        "user_name" = "Amit Sinha";
    }
);
status = 1;

}

2 个答案:

答案 0 :(得分:1)

请勿使用NSArray

我猜你的OrdersArrayNSArrayNSMutableArray。您应该首先将其转换为swift数组:

let swiftArray = Array(OrdersArray).map {  $0 as! NSString }

然后过滤swift数组:

filtered = swiftArray.filter(using: { (text) -> Bool in
    let range = tmp.rangeOfString(searchText, options: NSStringCompareOptions.CaseInsensitiveSearch)
    return range.location != NSNotFound
})

答案 1 :(得分:0)

试试这样!来自This

的参考
  import UIKit

class SearchViewController: UIViewController,UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {


    @IBOutlet weak var searchBar: UISearchBar!
    @IBOutlet weak var SearchTableView: UITableView!

    var searchActive : Bool = false
    var data = ["San Francisco","New York","San Jose","Chicago","Los Angeles","Austin","Seattle"]
    var filtered:[String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        /* Setup delegates */
        SearchTableView.delegate = self
        SearchTableView.dataSource = self
        searchBar.delegate = self
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }

    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 = data.filter({ (text) -> Bool in
            let tmp: NSString = text as NSString
            let range = tmp.range(of: searchText, options: .caseInsensitive)
            return range.location != NSNotFound
        })
        if(filtered.count == 0){
            searchActive = false;
        } else {
            searchActive = true;
        }
        SearchTableView.reloadData()
    }



    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if(searchActive) {
            return filtered.count
        }
        return data.count;
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! as UITableViewCell;
        if(searchActive){
            cell.textLabel?.text = filtered[indexPath.row]
        } else {
            cell.textLabel?.text = data[indexPath.row];
        }

        return cell;
    }
}