我正在使用一系列人的名字加载表格。我想根据每个人的居住州分开各个部分,同时将sectionIndexTitles限制在该州名称的首字母。我的sectionIndexTitles应该是[“ A”,“ C”,“ D”,“ F”,“ G”,“ H”,“ I”,“ K”,“ L”,“ M”,“ N”, “ O”,“ P”,“ R”,“ S”,“ T”,“ U”,“ V”,“ W”]],而表部分将分为所有50个状态。
从本质上讲,字母A(索引0)将属于阿拉斯加,阿拉巴马州,阿肯色州和亚利桑那州。没有B,因此下一个字母C(索引2)应滚动到加利福尼亚州,其节数为4。
我遇到的问题是,这些节显然没有正确索引,因此当点击除字母A以外的任何已索引标题时,表视图不会滚动到正确的字母。
答案 0 :(得分:2)
按状态名称对people数组进行分组,并从字典中创建元组数组。然后在tableview数据源方法中使用该数组
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
struct Person {
var name: String
var state: String
}
var allPeople = [Person]()
var groupedPeople = [(state:String, people:[Person])]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
allPeople = [Person(name: "a", state: "Alaska"), Person(name: "x", state: "Florida"),
Person(name: "c", state: "California")]
groupedPeople = Dictionary(grouping: allPeople, by: { $0.state }).sorted(by: { $0.key < $1.key })
.map({ (state:$0.key, people:$0.value)
})
}
func sectionIndexTitles(for tableView: UITableView) -> [String]? {
return Array(Set(groupedPeople.map({ String($0.state.first!) })))
}
func numberOfSections(in tableView: UITableView) -> Int {
return groupedPeople.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return groupedPeople[section].state
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return groupedPeople[section].people.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell(style: .subtitle, reuseIdentifier: "cell")
cell.textLabel?.text = groupedPeople[indexPath.section].people[indexPath.row].name
cell.detailTextLabel?.text = groupedPeople[indexPath.section].people[indexPath.row].state
return cell
}
}
更新
如果节的数量超过sectionIndexTitles
,则应实现sectionForSectionIndexTitle
方法并返回适当的节索引。
func tableView(_ tableView: UITableView, sectionForSectionIndexTitle title: String, at index: Int) -> Int {
if let index = groupedPeople.firstIndex(where: { $0.state.hasPrefix(title) }) {
return index
}
return 0
}