Сортировка строк в разделе в UITableView - PullRequest
0 голосов
/ 09 июня 2018

Я хотел бы отсортировать свои элементы в разделе UITableView.Таким образом, на скриншоте ниже в разделе «N / A» «папа» должен идти первым, а затем «Привет».В разделе «Последние 7 дней» элементы также должны быть отсортированы в алфавитном порядке.

enter image description here

Я не могу понять, где в жизненном цикле таблицы находитсясортировать предметы.Сортировка моей модели (список элементов) и использование ее с UITableView, похоже, не помогает.

РЕДАКТИРОВАТЬ

Пожалуйста, найдите ниже мой код.Теперь я понимаю, что лучше всего не только сортировать, но и фильтровать мои элементы в отдельные списки, по одному для каждого отображаемого раздела.Это лучше с точки зрения производительности, так как tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) продолжает вызываться для каждого отображаемого элемента.Несмотря на то, что он не вызывается для общего общего количества элементов, все равно будет неаккуратно сортировать главный список элементов каждый раз, когда отображается новый элемент.

Меня беспокоит то, чтоколичество секций может изменяться динамически и может достигать довольно большого числа (до 8).Группировка по разделам также может варьироваться - либо по приоритету, либо по срокам.Итак, я думаю, что мне нужно создать более сложную структуру данных для моей модели - вместо текущего простого списка и функций, которые его фильтруют и сортируют во время «отображения» класс с несколькими отсортированными списками, по одному для каждого раздела, может быть,,Мне нужно будет создать несколько таких классов, в зависимости от того, по какой группе пользователей.И эти классы также должны иметь пользовательские функции для поиска в модели элемента, который был нажат / обновлен на основе indexPath.Имеет смысл, хотя.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // Since I register the TableViewCell class to be used to create a new table view cell in viewDidLoad(), when tableView:cellForRowAtIndexPath: next needs a table cell, your new class will be used automatically.
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell

        // special case for empty, "add reminder" cell
        cell.toDoItem = nil

        if (indexPath as NSIndexPath).section >= ReminderDue.sections.count {
            return cell
        }

        // If a proper reminder is chosen
        if let definiteList = self.groupByDelegator.getReminderList() {

            // Take the master list of items and return a filtered sublist of items that belong to that section
            let sectionItems = ReminderDue.getReminders(definiteList, inSection: ReminderDue.sections[(indexPath as NSIndexPath).section])



            // Do the sorting here
            let QUERY_SETTINGS_KEY = "querysettings"
            if let definiteIndex = reminderListController.indexOfDisplayedCalInMenu {
                let definiteSetting = loadQuerySetting(definiteIndex, saveKey: QUERY_SETTINGS_KEY)
                sectionItems.sortBy(definiteSetting.sortBy)
            }

            cell.selectionStyle = .none     // This gets rid of the highlighting that happens when you select a table cell.

            // If a reminder (i.e., not the empty row at the end.)
            if !sectionItems.list.isEmpty && (indexPath as NSIndexPath).row < sectionItems.count {
                //            cell.delegate = self
                cell.delegate = updateReminderDelegate      // Assign as the TableViewCell's delegate the ReminderMainVC (via its UpdateReminderDelegate)

                let rem = sectionItems.list[(indexPath as NSIndexPath).row]
                cell.toDoItem = rem
            }
        }

        return cell
    }

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Вы не поделились своим кодом, поэтому я не могу использовать ваши конкретные значения, но вот пример.Я предполагаю, что у вас есть массив объектов, который используется для заполнения табличного представления, и что у этих объектов есть свойство для их раздела («низкий» или «нет» приоритет в вашем случае) и одно для их видимого значения имени («Vic's»)."или" папа "в качестве примера в вашем случае).

Редактировать : Благодаря @ rmaddy

Вы должны сначала отсортировать массив по свойству name, а затем отфильтроватьэто в новый массив для каждого раздела.Поскольку это стабильный алгоритм сортировки, алфавитный порядок имен будет сохраняться.Сделайте это, когда вы загрузите свои данные, которые могут быть в viewDidLoad():

override viewDidLoad() {
    super.viewDidLoad()

    // mainArray is your array of data model objects. You will need a strong reference to it  and the section arrays so declare them at the top of your view controller class.

    // This will sort your array by name
    mainArray.sort() { $0.name < $1.name }

    // Setup section arrays (I have assumed your objects have a property called priority

    // No priority
    noPriorityArray = mainArray.filter() { $0.priority == "none" }

    // Low priority
    lowPriorityArray = mainArray.filter() { $0.priority == "low" }
}

Затем получите доступ к этим массивам в методе делегата tableview:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell... // Put your code for getting cell here

    // Now code to get cell for each section
    if indexPath.section == 0 {

        // No priority
        cell.textLabel.text = noPriorityArray[indexPath.row]?.name

    } else if indexPath.section == 1 {

        // Low priority
        cell.textLabel.text = lowPriorityArray[indexPath.row]?.name
    }

    // Other code for other sections or other setup etc.

    return cell
}
0 голосов
/ 09 июня 2018
let sortedItems = arrayOfItems.sorted(by: <)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...