如何在对 Table 视图应用过滤器后保留原始 indexPath.row?

How to preserve the original indexPath.row after applying filters to Table View?

我的应用程序使用“过滤器”按钮,其中 whereField 查询根据按下的过滤器按钮进行优化。这是一个 before 过滤示例:

但这是 过滤后的示例:

问题是,当我点击其中一个行时,它会将我带到与我数据库中的 original indexPath.row 相对应的下一页那个行。我怎样才能保留原来的 indexPath.row?例如,单元格 B 始终为 indexPath.row = 1,即使在过滤后也是如此。

这是我的 cellForRowAt 我的第一个视图控制器。

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        // Get a cell
        let cell = tableView.dequeueReusableCell(withIdentifier: "MealPlanCell", for: indexPath) as! MealPlanCell
        
        // Get the mealPlan that the tableView is asking about
        let mealPlanInTable = mealPlan[indexPath.row]
        
        // Customize the cell
        cell.displayMealPlan(mealPlanInTable)
        
        // Return the cell
        return cell
        
    }

以及我如何在点击单元格后将此视图控制器的 indexPath.row 连接到下一个视图控制器:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        // Detect the indexPath the user selected
        let indexPath = tableView.indexPathForSelectedRow
        
        // Get the mealPlan the user selected
        let mealPlanSelected = mealPlan[indexPath!.row]
        
        // Get a reference to the NextiewController
        let NextVC = segue.destination as! NextViewController
        
        // Get a reference to the currentMealPlanIndex in the NextViewController
        NextVC.currentMealPlanIndex = indexPath!.row
        
    }

非常感谢任何建议!

您从错误的数组中获取值。另外最好传递 obj 而不是 index.

您需要有 2 个变量 - 一个用于所有数据,另一个用于过滤后的数据。 在 tableview 数据源中使用过滤数据 var 并传递给 NextVC。

考虑到您的 class 名字是 MealPlan。这是来源。

var allMealPlans: [MealPlan]
var filteredMealPlans: [MealPlan]

func onFilterButtonPressed() {
  filteredMealPlans = allMealPlans.filter({
      // return true/false here based on your filters
   })
  tableView.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    // Get a cell
    let cell = tableView.dequeueReusableCell(withIdentifier: "MealPlanCell", for: indexPath) as! MealPlanCell
    
    // Get the mealPlan that the tableView is asking about
    let mealPlanInTable = filteredMealPlans[indexPath.row]
    
    // Customize the cell
    cell.displayMealPlan(mealPlanInTable)
    
    // Return the cell
    return cell
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    
    // Detect the indexPath the user selected
    let indexPath = tableView.indexPathForSelectedRow
    
    // Get the mealPlan the user selected
    let mealPlanSelected = filteredMealPlans[indexPath!.row]
    
    // Get a reference to the NextiewController
    let NextVC = segue.destination as! NextViewController
    
    // Get a reference to the currentMealPlanIndex in the NextViewController
    NextVC.currentMealPlan = mealPlanSelected
}

在您的 NextVC 中为 currentMealPlan 添加一个变量

class NextVC: UIViewController {
  var currentMealPlan: MealPlan?
}

谢谢大家的comments/advice!我没有通过 indexPath 连接视图控制器中的数据,而是使用了与我的视图控制器之间流动的数据一致的文档 ID。这适用于我的所有过滤。

这是我的第一个 ViewController:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
        if let indexPath = tableView.indexPathForSelectedRow {
            
            let ingredientsVC = segue.destination as! IngredientsViewController
            let documentID = mealPlan[indexPath.row].docID
            ingredientsVC.currentMealPlanIndex = indexPath.row
            ingredientsVC.passedDocID = documentID!
        }
    }

这是我的第二个 ViewController:

// This variable references the unique Document ID
var passedDocID = ""

// This is how I use that document ID to get a reference to the appropriate data
let selectedMealPlanIndex = mealPlan.firstIndex(where: {[=11=].docID == passedDocID})
            let currentMealPlan = mealPlan[selectedMealPlanIndex!]