- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个这种形式的数据源:
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.countries
和 dataSource.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/
我是一名优秀的程序员,十分优秀!