我想在UITableView的一个部分中对我的项目进行排序。因此,在“N / A”部分下面的屏幕截图中,“爸爸”需要首先跟随“嗨”。在“最后7天”部分中,项目也需要按字母顺序排序。
我无法弄清楚在表的生命周期中对项目进行排序的位置。对我的模型(项目列表)进行排序并将其与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
}
答案 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: <)