来自已过滤tableView的pushVC

时间:2019-01-26 15:06:04

标签: ios swift uitableview filter

我在tableView中添加了一个正常工作的SearchBar-如果单击未过滤的tableView中的某个单元格,它将使我进入第二个VC(聊天控制器)的右侧...但是如果我单击过滤后的tableView中的某个单元格,我被从未过滤的tableView的单元格推到了第二个VC-因此,如果我过滤一个tableView并从filteredTableView的单元格上单击,我实际上会从unfilteredTableView的单元格上单击-希望您理解我的问题...

如果不是这样的示例::unfilteredTableView在第三个单元格中显示名称为“ Alex3”,现在,当我单击该单元格时,我将进入带有“ Alex3”的聊天室-但是如果我过滤tableView中的“ John3”并单击第三个单元格,但我没有进入与“ John3”的交谈,而是进入了与“ Alex3”的交谈

这是代码:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    searchController.dismiss(animated: true, completion: nil)
    let user = self.users[indexPath.row]
    let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
    chatLogController.user = user
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.navigationController?.pushViewController(chatLogController, animated: true)
    }
}

SearchBar / Controller的代码:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isFiltering() {
        return filtered.count
    }
    return users.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserCell
    var user = users[indexPath.row]
    cell.textLabel?.text = user.name
    if isFiltering() {
        user = filtered[indexPath.row]
    } else {
        user = users[indexPath.row]
    }
    cell.textLabel!.text = user.name

    return cell
}

//UISearchBar
func searchBarIsEmpty() -> Bool {
    // Returns true if the text is empty or nil
    return searchController.searchBar.text?.isEmpty ?? true
}

func isFiltering() -> Bool {
    return searchController.isActive && !searchBarIsEmpty()
}

func filterContentForSearchText(_ searchText: String, scope: String = "All") {
    filtered = users.filter({( user : User) -> Bool in
        return (user.name?.lowercased().contains(searchText.lowercased()))!
    })
    tableView.reloadData()
}


}

extension NewMessageController: UISearchResultsUpdating {
// MARK: - UISearchResultsUpdating Delegate
func updateSearchResults(for searchController: UISearchController) {
    filterContentForSearchText(searchController.searchBar.text!)
    }
}

1 个答案:

答案 0 :(得分:1)

如果您可以共享有助于分析问题的过滤逻辑,那么这里没有什么帮助,但是根据您的共享,我有一个建议。

let user = self.users[indexPath.row]

检查是否从过滤列表而不是原始列表中获取用户。这可能有帮助

请在下面的示例代码中找到帮助

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    searchController.dismiss(animated: true, completion: nil)
    var user : User?
    if isFiltering() {
        user = filtered[indexPath.row]
    } else {
        user = users[indexPath.row]
    }
    let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
    chatLogController.user = user
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
        self.navigationController?.pushViewController(chatLogController, animated: true)
    }
}