对UITableView中的节中的行进行排序

时间:2018-06-09 05:36:26

标签: swift uitableview sorting

我想在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 :(得分:1)

您尚未共享代码,因此我无法使用您的特定值,但这是一个示例。我假设您有一个用于填充tableview的对象数组,并且这些对象具有其属性的属性(在您的情况下为“低”或“无”优先级),另一个用于其可见名称值(“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
}

答案 1 :(得分:0)

let sortedItems = arrayOfItems.sorted(by: <)