gpt4 book ai didi

Swift:如何隐藏/显示 `didSelectRowAt indexPath` 部分中的行

转载 作者:行者123 更新时间:2023-11-28 13:22:53 25 4
gpt4 key购买 nike

image

这是我想要实现的示例。一般来说,我有一个类似 [Category] 数组的数据源:

public struct Category {
let name: String
let image: UIImage
let id: Int
let subCategories: [SubCategory]
var onCategorySelected: (Int) -> Void
}

public struct SubCategory {
let name: String
let id: Int
var onSubCategorySelected: (Int) -> Void
}

我开始采用的方法是,Category 是一个部分,SubCategory 是一行。因此,在 numberOfSections 中,我返回类别数组 count,在 numberOfRowsInSection 中,如果未选择类别,我返回 1 并且 subcategory.count + 1 如果选中。在 cellForRowAt 上,我从自定义类设置了适当的单元格。

我坚持使用 tableview 委托(delegate)方法:didSelectRowAt indexPath。如何折叠或展开特定部分中的行。我正在尝试:

    public override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath)

if indexPath.section == selectedCategory {
var indexToRemove: [IndexPath] = []
(1...props.categories[selectedCategory].subCategories.count).forEach { idx in
indexToRemove.append(IndexPath(row: idx, section: selectedCategory))
}
tableView.beginUpdates()
tableView.deleteRows(at: indexToRemove, with: .top)
tableView.endUpdates()
}
}

我迷上了,因为我没有更新数据源,但似乎我实际上不需要从数据源中删除这些元素,而只是在未选择部分的第一行时隐藏,如果选择则立即显示.欢迎任何显示此类结构的帮助甚至一般方法!谢谢!

最佳答案

我认为你会以这种方式挣扎,因为类别标题没有内置点击事件的处理程序(尽管你可以将它们构建到自定义标题 View 中)但是当一个部分的 numberOfRows = 0 时,部分标题未显示。

更好的方法是将所有条目放在具有两种类型的自定义单元格的单个 tableView 部分中:一种单元格设计用于类别,另一种用于子类别。将 Bool 变量添加到 Category 中,调用类似 expanded 的内容来跟踪某个部分何时展开。使用具有关联值的枚举创建一个数组,为每个可见单元格保存一个条目,以显示它是类别还是子类别。然后在类别单元格的 didSelectRowAt 中,您可以检查展开的属性,然后根据需要插入或删除子类别单元格。

解决方案的概要如下所示(全部凭内存输入,因此很可能存在一些语法问题,但它应该足以让您继续前进)

public struct Category {
let name: String
let image: UIImage
let id: Int
let subCategories: [SubCategory]
var expanded = false
var onCategorySelected: (Int) -> Void
}

class CategoryCell: UITableViewCell {
static let cellID = "CategoryCell"

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//set up imageViews (main & up/down) and textLabel
}

func configure(with category: Category {
//populate cell fields from category
}
}

class CategoryCell: UITableViewCell {
static let cellID = "SubcategoryCell"

// same things as above
}

然后在 View Controller 中

enum RowType {
case category (Category)
case subcategory (SubCategory)

func toggled() -> RowType {
switch self {
case .subcategory: return self
case .category (let category):
category.expanded.toggle()
return .category(category)
}
}
}

//create an array of rows currently being displayed. Start with just Categories
var visibleRows: [RowType] = ArrayOfCategories.map{RowType.Category($0)}

override func viewDidLoad() {
super.viewDidLoad()
tableView.register(CategoryCell.self, forCellReuseIdentifier: CategoryCell.cellID )
tableView.register(SubCategoryCell.self, forCellReuseIdentifier: SubCategoryCell.cellID)
}

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return visibleRows.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch visibleRows[indexPath.row]
case .Category (let category):
let cell = tableView.dequeueReusableCell(withIdentifier: CategoryCell.CellID, for: indexPath) as! CategoryCell
cell.configure(with: category)
return cell
case .subCategory (let subCategory):
let cell = tableView.dequeueReusableCell(withIdentifier: SubCategoryCell.CellID, for: indexPath) as! SubCategoryCell
cell.configure(with: subCategory)
return cell
}
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
switch visibleRows[indexPath.row] {
case .category(let category):
if category.expanded {
tableView.deleteRows(... //delete the subCategory rows
visibleRows.remove( ... //delete the same rows from visibleRows
} else {
visibleRows.insert( ... //insert the .subcategory rows corresponding to the category struct's [subCategory] array
tableView.insertRows(... //insert the appropriate subCategory rows
}
visibleRows[indexPath.row] = visibleRows[indexPath.row].expanded.toggled()
tableView.reloadRows(at:[indexPath.row], with: .fade)

case .subCategory (let subCategory):
//do anything you want for a click on a subCat row
}
}


关于Swift:如何隐藏/显示 `didSelectRowAt indexPath` 部分中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58847024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com