8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

UITableView 部分默认显示为展开,尽管图标指示它们应该折叠

kdubs 2月前

26 0

我正在使用 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 的组合来管理哪些部分是打开的或关闭的。尽管设置了这些控件,但默认情况下所有部分都显示为展开,但它们旁边的图标显示加号,表示它们应该折叠。

我如何确保所有部分最初都是折叠的,与它们的图标匹配,并且仅在单击部分标题时展开?

帖子版权声明 1、本帖标题:UITableView 部分默认显示为展开,尽管图标指示它们应该折叠
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由kdubs在本站《uitableview》版块原创发布, 转载请注明出处!
最新回复 (0)
返回
作者最近主题: