Я использую массив имен людей для загрузки таблицы. Я хочу разделить разделы на основе штата проживания каждого человека, сохраняя при этом, чтобы sectionIndexTitles ограничивался первой буквой названия штата. Мой sectionIndexTitles будет, т.е. ["A", "C", "D", "F", "G", "H", "I", "K", "L", "M", "N", «O», «P», «R», «S», «T», «U», «V», «W»], а секции таблицы будут разделены на все 50 состояний.
По сути, буква А (индекс 0) будет принадлежать Аляске, Алабаме, Арканзасу и Аризоне. B нет, поэтому следующая буква C (индекс 2) должна прокручиваться до Калифорнии, где количество разделов равно 4.
Проблема, с которой я сталкиваюсь, заключается в том, что разделы, очевидно, неправильно проиндексированы, поэтому при нажатии на любой проиндексированный заголовок, кроме буквы A, табличное представление не прокручивается до нужной буквы.
Да, люди возражают. Я не добавлял методы, потому что в них много лишнего, не связанного с вопросом. Панель поиска, сегментированный элемент управления для переключения между порядком по фамилии или порядком по названию штата. Я не хочу делать это более сложным, чем это необходимо. Я могу отправить его вам, если хотите. Я просто не хотел загромождать вопрос/проблему.
Вы проверили мой ответ. Ты это понимаешь?
Да, я сделал. Он отлично работает, но выдает повторяющиеся буквы в sectionIndexTitles.
Это создало неупорядоченный массив sectionIndexTitles, и нажатие на буквы не прокручивается должным образом. Оригинал лучше.
Попробуйте return Array(Set(groupedPeople.map({ String($0.state.first!) }))).sorted()
У меня нет большого списка для тестирования
Давайте продолжить обсуждение в чате.
Сгруппируйте массив людей по имени штата и создайте массив кортежей из словаря. Затем используйте этот массив в методах источника данных 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
}
У вас есть массив объектов людей? Показать методы источника данных tableview