在 UITableView 中显示搜索结果

Posted

技术标签:

【中文标题】在 UITableView 中显示搜索结果【英文标题】:Displaying Search Results in UITableView 【发布时间】:2016-09-16 13:06:35 【问题描述】:

我有一个UITableViewController,并添加了一个搜索栏作为标题视图。当搜索栏中的文本发生更改但它不起作用时,我正在尝试重新加载表格视图数据。

这是我的textDidChange 方法。对于上下文,jsonArray[[String: AnyObject]] 并且是从另一个视图控制器传递的。然后在viewDidLoad() 中将searchResults 数组设置为jsonArray,并且表格视图使用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)")

【问题讨论】:

【参考方案1】:

我通过在 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)
                

【讨论】:

【参考方案2】:

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

    searchResults = NSMutableArray.init()

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

    searchResults.addObject(market)

【讨论】:

我使用的是 Swift 数组,而不是 NSArray。

以上是关于在 UITableView 中显示搜索结果的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中显示 Json 结果

使用 UISearchController 显示搜索结果和键盘覆盖 UITableView 中的底部行/部分

视图控制器中的搜索栏和搜索显示控制器,其中包含 UITableView

如何在uitableview中添加搜索栏?

iOS7 中 UISearchBar 和 UITableView 的问题

Swift UITableView 未显示所有结果