【问题标题】:How to preserve the original indexPath.row after applying filters to Table View?将过滤器应用于表格视图后如何保留原始 indexPath.row?
【发布时间】:2021-10-19 20:04:26
【问题描述】:

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

但这是 过滤后的示例:

问题是,当我单击其中一个行时,它会将我带到与我的数据库中属于该行的原始 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
        
    }

非常感谢任何建议!

【问题讨论】:

  • 所以我看到您的问题是您将索引传递给您的NextVC,并且该索引应该对应于原始的未过滤数组,对吗?您是否有机会将 mealPlan 对象本身或可能是一个 id(稍后从数据库中查询该对象)传递给 NextVC?
  • 类似NextVC.mealPlan = mealPlanSelected
  • 您应该将indexPath.row 视为表格视图控制器的私有实现细节。永远不要将它传递给另一个视图或视图控制器。你自己通过膳食计划。
  • 一个叫“mealPlan”的人是从哪里来的?拥有一个为数据源中的每条记录显示唯一值的键。

标签: ios swift uitableview filter uistoryboardsegue


【解决方案1】:

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

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

考虑到您的班级名称是 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?
}

【讨论】:

    【解决方案2】:

    感谢大家的 cmets/建议!我没有通过 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: {$0.docID == passedDocID})
                let currentMealPlan = mealPlan[selectedMealPlanIndex!]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多