过滤一个 Json 填充的 UITableView Swift 2

Posted

技术标签:

【中文标题】过滤一个 Json 填充的 UITableView Swift 2【英文标题】:filtering a Json populated UITableView Swift 2 【发布时间】:2015-11-03 13:36:07 【问题描述】:

我正在尝试过滤一个 JSON 填充的 UITableView,到目前为止,我已经尝试了 3 或 4 个非常好的教程,但是当我按下 SearchBar 时,我都遇到了同样的错误。

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'不能使用 in/contains 运算符 与集合 MakeItWork.Repository(不是集合'

与我看到的教程唯一不同的是我的数组在另一个文件上,我从那里调用它。

Repository.swift

class Repository 

var name: String?
var releaseDate: String?
var gameImage: String?
var id: String?

init(json: NSDictionary) 
    self.name = json["name"] as? String
    self.releaseDate = json["release_date"] as? String
    self.gameImage = json["image"] as? String
    self.id = json["_id"] as? String
 

还有 GameTableViewController.swift

var games = [Repository]()
var filteredTableData = [String]()
var shouldShowSearchResults = false
var searchController: UISearchController!


func configureSearchController() 
    // Initialize and perform a minimum configuration to the search controller.
    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search here..."
    searchController.searchBar.delegate = self
    searchController.searchBar.sizeToFit()

    // Place the search bar view to the tableview headerview.
    self.tableView.tableHeaderView = searchController.searchBar


func updateSearchResultsForSearchController(searchController: UISearchController) 

    let searchString = searchController.searchBar.text!
    filteredTableData.removeAll(keepCapacity: false)

    let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@",searchString)
    let array = (games as NSArray).filteredArrayUsingPredicate(searchPredicate)
    filteredTableData = array as! [String]

    self.tableView.reloadData()


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    if shouldShowSearchResults 
        return filteredTableData.count
    
    else 
        return games.count
    


  override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cellIdentifier = "GameTableViewCell"
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! GameTableViewCell

    if (shouldShowSearchResults) 
        cell.nameLabel?.text = filteredTableData[indexPath.row]

        return cell
    
    else 

        cell.nameLabel?.text = games[indexPath.row].name
        cell.releaseDateLabel?.text = games[indexPath.row].releaseDate

        if let url = NSURL(string: self.games[indexPath.row].gameImage!) 
            cell.photoImageView?.hnk_setImageFromURL(url)
        
    
    return cell

我在 updateSearchResultsForSearchController 的开头放置了一个断点,我注意到每次按下 UISearchBar 时,在崩溃之前,它都会使用 null searchString 进行搜索循环,因为我还没有在里面输入任何内容。这正常吗? 我检查的最后一个教程是 http://www.ioscreator.com/tutorials/add-search-table-view-tutorial-ios8-swift 。 我在这里错过了什么?

编辑:我认为 UISearchBar 在我调用UISearchResultsUpdating 时一直保持更新是正常的。

【问题讨论】:

【参考方案1】:

问题在于您的NSPredicate。它的编写方式是您尝试检查games 数组contain 中的对象是否为字符串。但是这个数组中的对象是Repository 的实例,谓词无法知道Repository 包含某些东西意味着什么。要解决此问题,您应该将谓词更改为:

NSPredicate(format: "SELF.name CONTAINS[c] %@",searchString)

这样,谓词将检查Repository 实例的name 属性是否包含提供的搜索字符串。

我写了一点关于NSPredicate here 的文章。

如果有什么不清楚的地方请告诉我。

【讨论】:

谢谢你让我绕过了那个错误,但是它在下一行代码中崩溃了 NSForwarding: 警告: object 0x7fac5bf7aa6​​0 of class 'MakeItWork.Repository' does not implement methodSignatureForSelector: -- 麻烦前面无法识别的选择器 -[MakeItWork.Repository valueForKey:] 我读到,如果您遇到该错误,您需要将 :NSObject 放在您的类旁边,然后将 super.init() 放在 init()... 中。这给了我最后一行的另一个错误 fatal error: array cannot be bridged from Objective-C 我是否应该针对当前遇到的错误提出另一个问题并将其标记为已回答,因为您的答案解决了我提到的问题,尽管之后出现了错误? 这可能是最好的,因为更多的人会注意到你的新问题。而且我没有经常使用“Swift”,很遗憾不知道如何进一步帮助您。

以上是关于过滤一个 Json 填充的 UITableView Swift 2的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 json 数据填充 UITableview

使用 JSON 数据填充 UITableView

UITableView 中的 UITableView,填充了字符串和数组的 JSON 数组 [关闭]

如何使用 JSON 数据填充 UITableView?

如何使用来自不同 ViewController 的 JSON 响应填充 UITableView?

使用嵌套 JSON 填充 UITableView