如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引

Posted

技术标签:

【中文标题】如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引【英文标题】:How to get the index of current item of all items in Tableview from SearchBar 【发布时间】:2017-03-03 16:21:47 【问题描述】:

我正在尝试从 Tableview 中删除一个项目,如果 SearchBar 为空,一切正常,(indexPath 是正确的索引)。但如果我使用 SearchBar 我会得到过滤项目的索引。

如何从 Tableview 中获取项目的当前索引?但是在使用 SearchBar 过滤之后。

 func filterTableView(ind:Int,text:String) 
        switch ind 
        case selectedScope.reviewDate.rawValue:
            filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
                return mod.reviewDate.lowercased().contains(text.lowercased())
            )
            self.tableView.reloadData()

        case selectedScope.reviewPlace.rawValue:
            filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
                return mod.reviewPlace.lowercased().contains(text.lowercased())
            )
            self.tableView.reloadData()

        case selectedScope.reviewSum.rawValue:
            filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
                return mod.reviewSum.lowercased().contains(text.lowercased())
            )
            self.tableView.reloadData()

        
    


static var reviewDaysArr:[ReviewDay] = [

    ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"),
    ReviewDay(reviewDate: "03/03/2017", reviewPlace: "Manhattan"),
    ReviewDay(reviewDate: "05/03/2017", reviewPlace: "New Jersey")

]

var filteredDays = reviewDaysArr

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle == .delete 
        ViewController.reviewDaysArr.remove(at: indexPath.row)
        filteredDays = ViewController.reviewDaysArr
        tableView.deleteRows(at: [indexPath], with: .fade)
    

【问题讨论】:

过滤主数组而不是重新加载表格视图 同时添加您如何过滤数据的代码。 @NiravD 完成... @MarryG 好的,让我检查一下 【参考方案1】:

您可以从过滤后的数组中获取主数组的索引。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle == .delete 
        //First check using your condition that is search active 
        if searchActive 
            //I'm comparing movieId you can compare any unique property of your Movie class
            if let index = ViewController.dataArr.index(where: $0.movieId == filterdData[indexPath.row].movieId) 
                //Remove object from mainArray
                ViewController.dataArr.remove(at: index)
                //Remove object from filtered array
                filterdData.remove(at: indexPath.row)
            
        
        else 
            ViewController.dataArr.remove(at: indexPath.row)
        
        tableView.deleteRows(at: [indexPath], with: .fade)
    

编辑:您的模型类Movie 没有任何唯一属性,只有一种方法可以获取对象的索引。您需要获取与主数组相对应的过滤数组的索引数组。因此,声明一个[Int] 类型的数组,并在过滤您的数组后获取该数组中的过滤器对象索引。

var filterIndices = [Int]()

现在你在过滤数组的地方也初始化了这个数组。

switch ind 
    case selectedScope.reviewDate.rawValue:
        filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
            return mod.reviewDate.lowercased().contains(text.lowercased())
        )
        filterIndices = ViewController.reviewDaysArr.indices.filter(
            ViewController.reviewDaysArr[$0].reviewDate.lowercased().contains(text.lowercased()) 
        )
        self.tableView.reloadData()

    case selectedScope.reviewPlace.rawValue:
        filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
            return mod.reviewPlace.lowercased().contains(text.lowercased())
        )
        filterIndices = ViewController.reviewDaysArr.indices.filter(
            ViewController.reviewDaysArr[$0].reviewPlace.lowercased().contains(text.lowercased()) 
        )
        self.tableView.reloadData()

    case selectedScope.reviewSum.rawValue:
        filteredDays = ViewController.reviewDaysArr.filter( (mod) -> Bool in
            return mod.reviewSum.lowercased().contains(text.lowercased())
        )
        filterIndices = ViewController.reviewDaysArr.indices.filter(
            ViewController.reviewDaysArr[$0].reviewSum.lowercased().contains(text.lowercased()) 
        )
        self.tableView.reloadData()

现在在commit editingStyle 中获取这个索引表单数组并从主数组和过滤数组中删除该对象。

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) 
    if editingStyle == .delete 
        //First check using your condition that is search active 
        if searchActive 
            //Remove object from mainArray using filterIndices
            ViewController.reviewDaysArr.remove(at: filterIndices[indexPath.row])
            //Remove object from filtered array
            filteredDays.remove(at: indexPath.row)
        
        else 
            ViewController.reviewDaysArr.remove(at: indexPath.row)
        
        tableView.deleteRows(at: [indexPath], with: .fade)
    

【讨论】:

@MarryG 然后您可以使用您在单元格中显示的电影名称 就我而言,我没有任何movieID 或该对象独有的东西。截图只是为了解释我的观点。在我的对象中,我只有会议日期和地点,但这不是唯一的......

以上是关于如何从 SearchBar 中获取 Tableview 中所有项目的当前项目的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SearchBar 从服务器获取数据

如何从 tableview 单元格中搜索数据?

在 Swift 中从 SearchBar 中选择单元格

SearchBar 可点击结果 - 核心数据

以相同的方式在GMSAutocomplete中使用textfield而不是searchbar

没有焦点时如何在SearchBar中单击一次取消按钮