我正在使用 UITableView 在我的 iOS 应用中实现侧边菜单。表格视图显示类别列表,其中每个类别可以有多个子项。每个类别由一个部分表示...
我正在使用 UITableView 在我的 iOS 应用中实现侧边菜单。表格视图显示类别列表,其中每个类别可以有多个子项。每个类别都由一个部分表示,单击某个类别可以展开或折叠该部分以显示或隐藏其子项。我面临的问题是,除了一个部分之外的所有部分都默认显示为展开,即使它们的图标表明它们应该折叠。
我希望所有部分最初都是折叠的,只有当用户点击部分标题时才展开。尽管我尝试通过 hiddenSections 和 expandSections 集来管理此行为,但仍然遇到问题。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
bindViewModel()
expandedSections.removeAll()
hiddenSections = Set(0 ..< categories.count)
tableView.reloadData()
}
func bindViewModel() {
viewModel?.getSideMenu()
viewModel?.menuList.subscribe(onNext: { categories in
self.categories = categories
for (index, model) in categories.enumerated() {
for item in model.items {
switch item {
case .CategoriesSectionItem:
self.hiddenSections.insert(index)
default:
break
}
}
}
self.tableView.reloadData()
}).disposed(by: disposeBag)
}
func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {
if hiddenSections.contains(section) {
return 0
}
for item in categories[section].items {
switch item {
case let .CategoriesSectionItem(control):
return control.controls?.count ?? 0
default:
break
}
}
return 0
}
func itemClicked(sender: UIButton, lineView: UIView, icon: UIImageView, categoriesCount _: Int, selectedIndex _: Int?, subControl _: SideMenuControl?, control _: CategoriesModel?) {
let section = sender.tag
if hiddenSections.contains(section) {
hiddenSections.remove(section)
icon.image = UIImage(named: "MinusIcon")
lineView.isHidden = true
let indexPathsToInsert = indexPathsForSection(section)
if !indexPathsToInsert.isEmpty {
tableView.insertRows(at: indexPathsToInsert, with: .fade)
}
expandedSections.append(section)
} else {
hiddenSections.insert(section)
icon.image = UIImage(named: "PlusIcon")
let indexPathsToDelete = indexPathsForSection(section)
if !indexPathsToDelete.isEmpty {
tableView.deleteRows(at: indexPathsToDelete, with: .fade)
}
lineView.isHidden = false
}
for expandedSection in expandedSections where section != expandedSection {
if hiddenSections.contains(expandedSection) { continue }
hiddenSections.insert(expandedSection)
let indexPathsToDelete = indexPathsForSection(expandedSection)
if !indexPathsToDelete.isEmpty {
tableView.deleteRows(at: indexPathsToDelete, with: .fade)
}
tableView.reloadSections([expandedSection], with: .none)
if let index = expandedSections.firstIndex(of: expandedSection) {
expandedSections.remove(at: index)
}
}
}
func indexPathsForSection(_ section: Int) -> [IndexPath] {
var indexPaths = [IndexPath]()
for item in categories[section].items {
switch item {
case let .CategoriesSectionItem(control):
for row in 0 ..< (control.controls?.count ?? 0) {
indexPaths.append(IndexPath(row: row, section: section))
}
default:
break
}
}
return indexPaths
}
我使用 hiddenSections 和 expandedSections 的组合来管理哪些部分是打开的或关闭的。尽管设置了这些控件,但默认情况下所有部分都显示为展开,但它们旁边的图标显示加号,表示它们应该折叠。
我如何确保所有部分最初都是折叠的,与它们的图标匹配,并且仅在单击部分标题时展开?