如何使用 Swift 按字母顺序将表格视图数据划分为多个部分? (重写)

Posted

技术标签:

【中文标题】如何使用 Swift 按字母顺序将表格视图数据划分为多个部分? (重写)【英文标题】:How can I divide my table view data in sections alphabetically using Swift? (rewritten) 【发布时间】:2019-08-15 16:43:00 【问题描述】:

我有一个这种形式的数据源:

struct Country 
    let name: String

其他属性不会在这个阶段发挥作用,所以让我们保持简单。

我已将 ViewController 和 TableViewDataSource 分开在两个单独的文件中。数据源代码如下:

class CountryDataSource: NSObject, UITableViewDataSource 
    var countries = [Country]()
    var filteredCountries = [Country]()
    var dataChanged: (() -> Void)?
    var tableView: UITableView!

    let searchController = UISearchController(searchResultsController: nil)

    var filterText: String? 
        didSet 
            filteredCountries = countries.matching(filterText)
            self.dataChanged?()
        
    

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        let country: Country

        country = filteredCountries[indexPath.row]
        cell.textLabel?.text = country.name

        return cell
    

如您所见,已经有一个过滤机制。 这是视图控制器最相关的部分:

class ViewController: UITableViewController, URLSessionDataDelegate 
    let dataSource = CountryDataSource()

    override func viewDidLoad() 
        super.viewDidLoad()

        dataSource.tableView = self.tableView
        dataSource.dataChanged =  [weak self] in
            self?.tableView.reloadData()
        

        tableView.dataSource = dataSource

        // Setup the Search Controller
        dataSource.searchController.searchResultsUpdater = self
        dataSource.searchController.obscuresBackgroundDuringPresentation = false
        dataSource.searchController.searchBar.placeholder = "Search countries..."
        navigationItem.searchController = dataSource.searchController
        definesPresentationContext = true

        performSelector(inBackground: #selector(loadCountries), with: nil)
    

loadCountries 用于获取 JSON 并在 dataSource.countriesdataSource.filteredCountries 数组中加载表格视图。

现在,如何在不破坏这一切的情况下获得像联系人应用程序那样的索引排序规则? 我尝试了几个教程,没有一个工作,因为他们需要一个 class 数据模型或视图控制器内的所有内容。 所有解决方案都尝试了崩溃(最坏的情况)或不加载正确的数据或无法识别它......

我需要一些帮助。 谢谢

【问题讨论】:

请search。有很多相关的问题 我知道 :-( ...但它们都很老了,其中大多数包括 Objective-C。我想知道是否可以使用数据作为结构。 是的,有可能。 能否请您指出一个可以解决此问题的问题? (我在等待时正在查看您的链接)...我保证如果找到问题我会关闭它,但我在写之前搜索过... 具体建议取决于您的设计。请阅读我的搜索查询中的答案。 【参考方案1】:

我建议您使用 CellViewModels 而不是模型数据。 步骤:

1) 使用按字母顺序排序的单元格视图模型为每个单词创建一个数组。如果您有 A、C、F、L、Y 和 Z 的数据,您将拥有 6 个带有单元格视图模型的数组。我将它们称为“sectionArray”。

2) 创建另一个数组并添加按字母顺序排序的 sectionArrays,即“cellModelsData”。所以,cellModelsData 是一个 sectionArrays 数组。

3) 在 numberOfSections 上返回 cellModelsData 的计数。

4) 在numberOfRowsInSection 上,根据节号(cellModelsData[section]) 获取cellModelsData 中的sectionArray,并返回该sectionArray 的计数。

5) 在 cellForRowAtindexPath 上获取 sectionArray (cellModelsData[indexPath.section]),然后获取 "cellModel" (sectionArray[indexPath.row])。将单元格出列并将单元格模型设置为单元格。

我认为这种方法应该可以解决您的问题。

我在 BitBucket 中制作了一个可以帮助您的示例项目:https://bitbucket.org/gastonmontes/reutilizablecellssampleproject

示例: 你有以下几句话: 做。 任何。 签证。 数数。 拒绝。 添加。 国家/地区。

1)

SectionArrayA:[添加,任意]

SectionArrayC:[计数,国家/地区]

SectionArrayR:[拒绝]

SectionArrayV:[签证]

2)

cellModelsData = [ [SectionArrayA], [SectionArrayC], [SectionArrayR], [SectionArrayV] ]

3)

func numberOfSections(in tableView: UITableView) -> Int 
    return self.cellModelsData.count

4)

public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    let sectionModels = self.cellModelsData[section]
    return sectionModels.count

5)

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let sectionModels = self.cellModelsData[indexPath.section]
    let cellModel = sectionModels[indexPath.row]

    let cell = self.sampleCellsTableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier",
                                                             for: indexPath) as! YourCell
    cell.cellSetModel(cellModel)

    return cell

【讨论】:

谢谢!对于我的应用程序来说,这看起来真的有点矫枉过正。我只需要对我的模型进行字母分割,该模型是一个结构,并且已经使用 UISearchBarController 实现了过滤...

以上是关于如何使用 Swift 按字母顺序将表格视图数据划分为多个部分? (重写)的主要内容,如果未能解决你的问题,请参考以下文章

表格视图从 NSDictionary 加载,但不按字母顺序

如何将 NSArray 拆分为按字母顺序排列的部分以与索引表视图一起使用

如何按字母顺序对表格视图单元格进行排序

Swift UITableView(无部分)过滤到带有部分的表格视图

如何在 swift 中按字母顺序对 JSON 字符串进行排序?

Swift UI:当视图中显示空列表时,如何显示错误消息?