gpt4 book ai didi

ios - 如何使用 Swift 按字母顺序将 TableView 数据分成几部分? (重写)

转载 作者:行者123 更新时间:2023-11-28 13:30:10 24 4
gpt4 key购买 nike

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

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
}
}

如您所见,过滤机制已经到位。这是 View Controller 最相关的部分:

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 并将 TableView 加载到 dataSource.countriesdataSource.filteredCountries 数组中。

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

拜托,我需要一些帮助。谢谢

最佳答案

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

1) 使用按字母顺序排序的单元格 View 模型,为每个单词创建一个数组。如果你有 A、C、F、L、Y 和 Z 的数据,你将有 6 个带有单元格 View 模型的数组。我将它们称为“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
}

关于ios - 如何使用 Swift 按字母顺序将 TableView 数据分成几部分? (重写),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com