在 tableview 中对动态部分进行排序 |迅速

Posted

技术标签:

【中文标题】在 tableview 中对动态部分进行排序 |迅速【英文标题】:Issue sorting dynamic sections in tableview | Swift 【发布时间】:2021-11-03 18:32:18 【问题描述】:

如何对从datestamp 字段动态生成的以下部分进行排序?例如2021-11-3的部分需要显示在2021-11-2上方的tableview中

数据戳格式: 2021-11-3

var sections = [mySections]()
var structure = [myStructure]()

private func fetchJSON() 
    
    guard let url = URL(string: "test.com")
    else  return 
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = "id=\1".data(using: .utf8)
    

URLSession.shared.dataTask(with: request)  data, _, error in
guard let data = data else  return 
                
do 
  let decoder = JSONDecoder()
  self.structure.sort  $0. datestamp > $1.datestamp 
  let res = try decoder.decode([myStructure].self, from: data)
  let grouped = Dictionary(grouping: res, by:  $0. datestamp )
  let keys = grouped.keys.sorted()
self.sections = keys.map(mySections(date: $0, items: grouped[$0]!
                    
))
  DispatchQueue.main.async 
  self.tableView.reloadData()

        
        
        catch 
            print(error)
        
    .resume()
 

我尝试在self.sections 下执行以下操作,但它没有做任何事情:

self.sections.sorted  $0.date > $1.date 

结构:

struct mySections 
    let date : String
    var items : [myStructure]



struct myStructure: Decodable 
    
    let recordid: Int
    let testname: Int
    let datestamp: String

数据示例:

[
   
    "recordid": 1,
    "testname": "Jen",
    "datestamp": "2021-11-3"
  ,
  
    "recordid": 1,
    "testname": "Jake",
    "datestamp": "2021-11-2"
  
]

【问题讨论】:

不清楚mySectionsdate字段是否设置准确——你还没有包含routeSections。您能否提供您的 JSON 以及使其成为 minimal reproducible example 所需的剩余代码? 请看更新后的帖子 感谢您的帮助 - 请您看一下其他帖子,感谢您的帮助。 ***.com/questions/69860143/… 【参考方案1】:

现在,您正在根据dateTimeStampstructure 进行排序,这没有任何作用,因为structure 中没有任何数据。

在我的游乐场示例中,就像您的代码一样,我使用了Dictionary(grouped:)。然后,我将map 那些结果通过date 发送给mySectionssort

最后print的结果是:

[“2021-11-4”、“2021-11-3”、“2021-11-2”]

let data = """
[
  
    "recordid": 1,
    "testname": "Jake",
    "datestamp": "2021-11-2"
  ,
  
    "recordid": 2,
    "testname": "Jen",
    "datestamp": "2021-11-3"
  ,
      
        "recordid": 3,
        "testname": "Bob",
        "datestamp": "2021-11-3"
      ,
      
        "recordid": 4,
        "testname": "Bill",
        "datestamp": "2021-11-4"
      
]
""".data(using: .utf8)!

struct mySections 
    let date : String
    var items : [myStructure]



struct myStructure: Decodable 
    let recordid: Int
    let testname: String
    let datestamp: String


var sections = [mySections]()
var structure = [myStructure]()

do 
    let decoder = JSONDecoder()
    let res = try decoder.decode([myStructure].self, from: data)
    let grouped = Dictionary(grouping: res, by:  $0.datestamp )
    sections = grouped.map  mySections(date: $0.key, items: $0.value) 
        .sorted  $0.date > $1.date 
    print(sections.map(\.date))
 catch 
    print(error)

可能值得注意的是,现在您的日期以统一的格式存储,非常适合基于字符串的排序。但是,如果您的端点返回的日期格式不统一(例如 2021-11-042021-11-3),您可能需要先转换为实际的 Date 并以此为基础进行排序。

【讨论】:

以上是关于在 tableview 中对动态部分进行排序 |迅速的主要内容,如果未能解决你的问题,请参考以下文章

在手动创建的部分中对核心数据 tableView 行进行分组

如何在 mySQL 中对动态生成的特定顺序进行排序?

在 UITableView 中对核心数据多对关系进行排序

在表格视图部分中对核心数据对象进行排序

在tableview中排序数组

如何在 UITableview 的部分中对 NSarray 进行排序