【问题标题】:Collapse section when click cell in UITableView in swift快速单击 UITableView 中的单元格时折叠部分
【发布时间】:2018-05-18 17:42:57
【问题描述】:

我有一个 UITableView,其中的部分数和这些部分下的单元格数来自我的服务。部分的数量是动态的,并且在其下包含动态单元格。取决于来自服务的数据。单击单元格时,我想折叠部分。单击其下的单元格时,每个部分都应折叠。我怎么能崩溃呢?我已经搜索了很多,但是当我们点击它展开和折叠的部分时,大多数结果都会显示。但我想在单击单元格时折叠部分。我在节标题中放置数据的代码是这样的,

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

    if tableView == resMenuTableView{

        return subCategoryModel!.count
    }
    else
    {
        return AddonCategoryModel!.count
    }
}
 func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    if tableView == resMenuTableView{

        return subCategoryModel![section].subCatName

    }
    else
    {
         return AddonCategoryModel![section].name
    }
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if tableView == resMenuTableView{
        return subCategoryModel![section].items.count
    }
    else
    {
        return AddonCategoryModel![section].addonItems.count
    }
}

【问题讨论】:

    标签: ios swift uitableview


    【解决方案1】:

    当您单击单元格时,您将获得来自indexPath.section 的部分。您可以更新 viewState 以设置部分折叠标志,然后重新加载表。设置了折叠标志的部分为该部分分配行数 0。

    如果一次只有一个部分在表格中折叠,您可以轻松处理逻辑。

    【讨论】:

    • 如何更新 viewState?在 viewForHeader 委托中在哪里重新加载表? @Aaina 耆那教
    • 如果您没有视图状态,则采用一个全局变量,即collapseSection,如下面的答案所述。如果您希望第一次折叠任何部分,请将此值设置为该变量。然后你需要在numberOfRowsInSection 方法中比较indexPath.sectioncollapseSection。如果部分匹配,则返回 1 else countOfRows。这里countOfRows 将来自数组/字典,因为您有动态数据。通过返回 1 作为行数,一个单元格将始终可见。如果需要,此可见单元格可以帮助您展开部分。
    • collapseSection中设置值后,您可以在didSelectItemAtIndexPath方法中使用tableView.reloadData()重新加载表。
    • 你能举个例子吗,我没听懂。 @Aaina 耆那教
    【解决方案2】:

    在不初始化的情况下获取一个全局 Int 值。

    var selectedSection: Int!
    

    点击单元格时,将单元格的部分索引分配给 selectedSection 并重新加载该部分。如果您想展开剩余部分,只需重新加载整个 tableview,而不是仅重新加载一个部分。

    selectedSection = indexPath.section
    tableView.reloadSections(IndexSet(integer: selectedSection), with: .top)
    

    在 numberOfCellsForSection 方法中检查 section 和 selectedSection 是否相同。如果它们相同,则需要折叠该部分,这意味着您需要提供原始行数。

    【讨论】:

    • 它重新加载表格视图但不折叠它。 @哈里
    • 那么,你有折叠动画的问题吗?
    • 如果您要重新加载整个表格数据,则很难实现动画效果。尝试用动画重新加载一个部分。 tableView.reloadSections(IndexSet(integer: selectedSection), with: .automic)
    • 我已经这样做了,它改变了它的位置,但没有正确关闭该部分。 @哈里
    • 您还需要维护先前选择的部分。当用户选择一个单元格时,您需要重新加载所选部分和先前选择的部分。用动画重新加载两者。
    猜你喜欢
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2016-12-23
    • 2015-08-06
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多