如何在对 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!]
我的应用程序使用“过滤器”按钮,其中 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!]