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

How to get the index of current item of all items in Tableview from SearchBar

我正在尝试从 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)
    }
}

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

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: {[=10=].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)
    }
}

编辑: 因为你的模型没有任何独特的 属性 class 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[[=12=]].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[[=12=]].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[[=12=]].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)
    }
}