Как заполнить разделы индексированного UITableView другим массивом для sectionIndexTitles

Я использую массив имен людей для загрузки таблицы. Я хочу разделить разделы на основе штата проживания каждого человека, сохраняя при этом, чтобы 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, табличное представление не прокручивается до нужной буквы.

У вас есть массив объектов людей? Показать методы источника данных tableview

RajeshKumar R 22.05.2019 16:22

Да, люди возражают. Я не добавлял методы, потому что в них много лишнего, не связанного с вопросом. Панель поиска, сегментированный элемент управления для переключения между порядком по фамилии или порядком по названию штата. Я не хочу делать это более сложным, чем это необходимо. Я могу отправить его вам, если хотите. Я просто не хотел загромождать вопрос/проблему.

GIJoeCodes 22.05.2019 16:31

Вы проверили мой ответ. Ты это понимаешь?

RajeshKumar R 22.05.2019 16:46

Да, я сделал. Он отлично работает, но выдает повторяющиеся буквы в sectionIndexTitles.

GIJoeCodes 22.05.2019 16:52

Это создало неупорядоченный массив sectionIndexTitles, и нажатие на буквы не прокручивается должным образом. Оригинал лучше.

GIJoeCodes 22.05.2019 16:59

Попробуйте return Array(Set(groupedPeople.map({ String($0.state.first!) }))).sorted() У меня нет большого списка для тестирования

RajeshKumar R 22.05.2019 17:00

Давайте продолжить обсуждение в чате.

RajeshKumar R 22.05.2019 17:00
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
7
117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сгруппируйте массив людей по имени штата и создайте массив кортежей из словаря. Затем используйте этот массив в методах источника данных 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
}

Другие вопросы по теме