【问题标题】:Put specific cells on top of the tableView将特定单元格放在 tableView 的顶部
【发布时间】:2022-02-10 00:41:04
【问题描述】:

如何将特定单元格显示在 tableView 顶部? , 例如我有 10 个单元格,其中 5 个为红色,另外 5 个为绿色,我想显示前 5 个单元格,顶部为绿色,另外 5 个单元格下方为红色?

我没有找到任何资源,所以我决定向亲爱的 SO 社区寻求建议。

代码:

extension MonitorimiViewController: UITableViewDelegate, UITableViewDataSource{

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return listOfVechicle.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "monitorimiCell", for: indexPath) as? MyCustomCell1 else {return UITableViewCell()}
    let currentVechicle = listOfVechicle[indexPath.row]

    cell.veturaOutlet.text = currentVechicle.Plate
    cell.shpejtsiaAktualeOutlet.text = currentVechicle.Speed!
    cell.perditsuarOutlet.text = "\(currentVechicle.LastCommunicationDate!.convertToDisplayForm())"
    cell.pasagjereOutlet.text = "\(currentVechicle.Passengers!) Person/a"
    cell.vozitesiOutlet.text = "\(currentVechicle.Driver!)"

    switch currentVechicle.Status {
    case 1:
        cell.colorsImageView.backgroundColor = .green
    case 2:
        cell.colorsImageView.backgroundColor = .red
    case 3:
        cell.colorsImageView.backgroundColor = .black
    case 4:
        cell.colorsImageView.backgroundColor = .orange
    default: break
    }

    return cell

所以从currentVechicle.Status 开始,我需要先显示案例 1,然后再显示其余部分。

我的数据结构来自 API:

struct Vehicles: Codable {

var  IDVehicle: Int?
var  Title: String?
var  RegistrationDate: String?
var  ExpireDate: String?
var  Department: String?
var  Identification: String?
var  Speed: String?
var  Latitude: Double?
var  Longitude: Double?
var  Angle: Int?
var  Status: Int?
var  InputValue: Int?
var  Plate: String?
var  LastCommunicationDate: String?
var  Passengers: Int?
var  Driver: String?

}

来自api的json形式的数据:

{
 "IDVehicle": 0,
 "Title": "Truck",
 "RegistrationDate": "2017-10-26T17:23:20.677",
 "ExpireDate": "2022-10-28T00:00:00",
 "Department": "Transport",
 "Identification": "863286023094252",
 "Speed": "0",
 "Latitude": 80.8769778,
 "Longitude": 70.9877813,
 "Angle": 265,
 "Status": 1,          // I want the cells sorted based on the Status, If status 1 show cells with 1 on top etc.
 "InputValue": 0,
 "Plate": "09 09 KO",
 "LastCommunicationDate": "2021-10-28T13:53:23",
 "Passengers": 0,
 "Driver": "Empty"
}

【问题讨论】:

  • 您可以相应地更新数据,也可以在cellForRow 方法中做一些事情。这是一个很好的提示,你可以从这里弄清楚。
  • @Rob 感谢您的回复! ,我对 swift 有点陌生,真的不知道这可能需要几天的时间:(,但我会更新代码,如果有人能做点什么来帮助:)
  • 在重新加载数据之前对您的 listOfVechicle 集合进行排序
  • 使用sort() 将您想要的带有status 的车辆放在其他车辆之前。这就是逻辑。您对数据(源)进行排序,而不是“单元格”。
  • @Larme 嘿,谢谢你回答我的菜鸟问题,但根据我的经验,我还没有使用过 sort(),它看起来有点棘手,数组和 $0 但如果我可以的话,我会试着弄清楚: )。

标签: swift xcode


【解决方案1】:
struct Vehicles: Codable {
    var Title: String
    var Status: Int // I'm assuming this will never be null in your JSON. Remove all your question marks except for keys that might not have values.
}

var data = [Vehicles(Title: "Honda", Status: 2), Vehicles(Title: "Mazda", Status: 1), Vehicles(Title: "Subaru", Status: 1)]
// You surely keep your data in an Array like this, right? You will need it formatted like this to be able to index it using `IndexPath.row`

data.sort{$0.Status < $1.Status}
// Call this when you're done populating your data.

这里的关键在于 .map {} 部分。 $0 表示列表中的 THIS 元素,就像 name 中的 for name in names {} 表示列表中的当前名称一样。 $1 表示列表中的下一个元素。使用.sort() 时,您将一个值与下一个值重复进行比较。在这种情况下,我们使用 &lt; 符号,因为我们希望较高的值位于列表的更下方。

【讨论】:

  • 根据我的代码编辑你的代码真的很难:(,但我想说的是根据你看到的 switch 语句进行排序,就像基本上把 case 1: cells on顶部 :)
  • cellForRowAt 不应用于组织数据。对于您拥有的每个单元格,该函数都会调用一次。在一个被多次调用的函数中组织一次数据是没有意义的。
  • @ioslifer 如果您发布您的数据结构,我可以为您修改我的代码。
  • 是的,伙计,检查
  • 嘿更新了,还有 var Status: Int?有 4 个值,每个值都有特定的颜色,比如 1 有绿色,2 有红色,3 有黑色,4 有橙色 :) 我的主 VC 上的原型单元图片:imgur.com/a/p7bJCR0
猜你喜欢
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2017-02-07
相关资源
最近更新 更多