在UITableView中显示搜索结果

时间:2016-09-16 13:06:36

标签: ios swift uitableview uisearchbar

我有一个UITableViewController,我添加了一个搜索栏作为标题视图。当搜索栏中的文本发生变化但是它无法正常工作时,我正试图让表格视图数据重新加载。

这是我的textDidChange方法。对于上下文,jsonArray[[String: AnyObject]]并从另一个视图控制器传递。然后,searchResults数组在jsonArray中设置为viewDidLoad(),表视图使用searchResults作为其数据源。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText.characters.count == 0 {
            searchResults?.removeAll()
            searchResults = jsonArray!
        } else {
            searchResults?.removeAll()
            for market in jsonArray! {
                let titleRange = market["name"]?.range(of: searchText, options: .caseInsensitive)

                var address = String()
                var city = String()
                var state = String()
                var zip = Int()

                if let address1 = market["address1"] as? String {
                    address = address1
                }

                if let city1 = market["city"] as? String {
                    city = city1
                }

                if let state1 = market["state"] as? String {
                    state = state1
                }

                if let zip1 = market["zip"] as? Int {
                    zip = zip1
                }

                let zipCode = String(describing: zip)
                let addressString = String("\(address) " + "\(city), " + "\(state) " + "\(zipCode)")
                let addressRange = addressString?.range(of: searchText, options: .caseInsensitive)

                if titleRange != nil {
                    searchResults?.append(market)
                } else if addressRange != nil {
                    searchResults?.append(market)
                }
            }
        }

        tableView.reloadData()
    }

我在for循环之后的else语句末尾添加了这个print语句,它显示数组包含它最初包含的所有对象,所以看起来我的范围无法正常工作。

print("search array: \(searchResults?.count)")

2 个答案:

答案 0 :(得分:0)

我通过在Swift中使用NSRange而不是Range来修复此问题。

let titleNSRange: NSRange = (market["name"]?.range(of: searchText, options: .caseInsensitive))!
let addressNSRange: NSRange = (addressNSString.range(of: searchText, options: .caseInsensitive))

if titleNSRange.location != NSNotFound || addressNSRange.location != NSNotFound {
                    searchResults?.append(market)
                }

答案 1 :(得分:-1)

你不需要调用searchResults吗?.removeAll()函数而不是你使用它

    searchResults = NSMutableArray.init()

不要使用searchResults?.append(市场)而是使用它

    searchResults.addObject(market)