如何在分段控制器内的 tableView 中保存选定行的状态?

Posted

技术标签:

【中文标题】如何在分段控制器内的 tableView 中保存选定行的状态?【英文标题】:How to save state of selected rows in tableView inside segmentedController? 【发布时间】:2021-08-24 16:28:43 【问题描述】:

我有一个带有两个段的分段控制器。每个段都有一个公共的 tableView。 切换段时如何保存选定的单元格?您能否提供一些想法如何实现它?

切换段时只能保存一个选定的行。

视图模型

var years: [String] = []
var genres: [String] = []

var selectedGenr: Int?
var selectedYear: Int?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    
    if segmentedControl.selectedSegmentIndex == 0 
        if viewModel.selectedGenr == indexPath.row 
            viewModel.selectedGenr = nil
         else 
            viewModel.selectedGenr = indexPath.row
        
     else 
        if viewModel.selectedYear == indexPath.row 
            viewModel.selectedYear = nil
         else 
            viewModel.selectedYear = indexPath.row
        
    
    tableView.reloadData()
    

【问题讨论】:

我认为问题在于您的视图层次结构。如果有一个“共享”表格视图,它不应该在分段控件的上方吗?如果它属于两个段,每个段中不应该有两个表视图(具有相同的数据源)吗?如果需要,我可以发布代码。 听起来你已经为自己命名了UISegmentedControl'segmentedControl'。不管你怎么称呼它,“segmentedControl”是从哪里来的?它的IBOutlet 声明在哪里? 【参考方案1】:

您可以将选择存储为视图模型中的列表 然后在表格视图中

伪代码

if segmentedControl.selectedSegmentIndex == 0 
if viewModel.selectedYears.contains(indexPath.row) 
viewModel.selectedYears.remove(indexPath.row)

else 
viewModel.selectedYears.append(indexPath.row)


【讨论】:

谢谢。我明白了你的想法。以这种方式解决了选择状态任务【参考方案2】:
if segmentedControl.selectedSegmentIndex == 0 
            if self.selectedIndexesForGenres.contains(indexPath.row) 
                if let index = self.selectedIndexesForGenres.firstIndex(of: indexPath.row) 
                                self.selectedIndexesForGenres.remove(at: index)
                            
                         else 
                            self.selectedIndexesForGenres.append(indexPath.row)
                        
            
        else 
            if self.selectedIndexesForYears.contains(indexPath.row) 
                if let index = self.selectedIndexesForYears.firstIndex(of: indexPath.row) 
                                self.selectedIndexesForYears.remove(at: index)
                            
                         else 
                            self.selectedIndexesForYears.append(indexPath.row)
                        
            
        self.tableView.reloadData()
            

【讨论】:

以上是关于如何在分段控制器内的 tableView 中保存选定行的状态?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何让分段控制锁定在屏幕顶部

将复选标记保存到 tableView Swift 时出现问题

如果在tableview中选中复选框,如何保存所选数组

如何在加载了 JSON API 数据的 tableview 单元格中保存复选标记属性?

Swift - 多个 TableView 复选标记 - 保存和加载选择

如何使用 SwiftUI 在 MacOS 上配置多选分段控制