简体   繁体   English

对象数组中的 UITableViewSections

[英]UITableViewSections from Array of Objects

i'm trying to achieve the following.我正在努力实现以下目标。 i'm mapping an xml string into a tableview.我正在将 xml 字符串映射到表格视图中。 This part is working fine, however i want to make sections in the tableview as well.这部分工作正常,但是我也想在 tableview 中制作部分。 I need the LINENAME to be the SectionName and the NODENAMES should be underneath those sections as rows.我需要 LINENAME 作为 SectionName 并且 NODENAMES 应该在这些部分的下面作为行。 Below is an example of how it should look like.下面是它应该是什么样子的示例。

  • header (LINE1) header (LINE1)

    • Cell (NODE1)单元格 (NODE1)
    • Cell (NODE2)单元格 (NODE2)
  • header (LINE2) header (LINE2)

    • Cell (Node1)单元格(节点 1)

etc... ETC...

Could somebody give me some more information on how to achieve this?有人可以给我更多关于如何实现这一目标的信息吗?

Thanks in advance.提前致谢。

var LineRows: [LineRow] = []

override func viewDidLoad() {
    super.viewDidLoad()

    let xmlString = """
    <?xml version="1.0" encoding="utf-8"?>
    <RESULT>
        <ROWSET>
            <ROW>
                <LINENAME>LINE1</LINENAME>
                <NODENAME>NODE1</NODENAME>
                <LINEID>1</LINEID>
            </ROW>
            <ROW>
                <LINENAME>LINE1</LINENAME>
                <NODENAME>NODE2</NODENAME>
                <LINEID>1</LINEID>
            </ROW>
            <ROW>
                <LINENAME>LINE2</LINENAME>
                <NODENAME>NODE1</NODENAME>
                <LINEID>2</LINEID>
            </ROW>
        </ROWSET>
    </RESULT>
    """

    let data = Data(xmlString.utf8) // Data for deserialization (from XML to object)
    do {
        let xml = try XMLSerialization.xmlObject(with: data, options: [.default, .cdataAsString])
        let food = XMLMapper<LineResult>().map(XMLObject: xml)

        print(food?.Linerowset?.Linerows?.first?.Linename ?? "nil")

        self.LineRows = food!.Linerowset?.Linerows ?? []
        self.tableView.reloadData()
        
       // debugPrint(LineRows)

    } catch {
        print(error)
    }

}

Map XML String to Array of Objects Map XML 字符串到对象数组

// MAP NODE DETAILS //


    class LineResult: XMLMappable {
        var nodeName: String!

        var error: String?
        var Linerowset: LineRowset?

        required init?(map: XMLMap) {}

        func mapping(map: XMLMap) {
            error <- map.attributes["error"]
            Linerowset <- map["ROWSET"]
        }
    }

    class LineRowset: XMLMappable {
        var nodeName: String!

        var Linerows: [LineRow]?

        required init?(map: XMLMap) {}

        func mapping(map: XMLMap) {
            Linerows <- map["ROW"]
        }
    }

    class LineRow: XMLMappable {
        var nodeName: String!

        var Linename: String?
        var Nodename: String?
        var LineLineID: String?

        required init?(map: XMLMap) {}

        func mapping(map: XMLMap) {
            Linename <- map["LINENAME"]
            Nodename <- map["NODENAME"]
            LineLineID <- map["LINEID"]

        }
    }

tableview:表视图:

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

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

        let Cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let person = LineRows[indexPath.row]

        Cell.textLabel?.text = person.Nodename

        return Cell

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard
            let indexPath = tableView.indexPathForSelectedRow,
            let vc = segue.destination as? LineDetails
        else {
            return
        }

        let person = LineRows[indexPath.row]
        vc.lineID = person.LineLineID!
    }

debugprint(LineRows) response:调试打印(LineRows)响应:

[ApiApp.LineController.LineRow, ApiApp.LineController.LineRow, ApiApp.LineController.LineRow]

dump(LineRows) response:转储(LineRows)响应:

LINE1
▿ 3 elements
  ▿ ApiApp.LineController.LineRow #0
    ▿ nodeName: Optional("ROW")
      - some: "ROW"
    ▿ Linename: Optional("LINE1")
      - some: "LINE1"
    ▿ Nodename: Optional("NODE1")
      - some: "NODE1"
    ▿ LineLineID: Optional("1")
      - some: "1"
  ▿ ApiApp.LineController.LineRow #1
    ▿ nodeName: Optional("ROW")
      - some: "ROW"
    ▿ Linename: Optional("LINE1")
      - some: "LINE1"
    ▿ Nodename: Optional("NODE2")
      - some: "NODE2"
    ▿ LineLineID: Optional("1")
      - some: "1"
  ▿ ApiApp.LineController.LineRow #2
    ▿ nodeName: Optional("ROW")
      - some: "ROW"
    ▿ Linename: Optional("LINE2")
      - some: "LINE2"
    ▿ Nodename: Optional("NODE1")
      - some: "NODE1"
    ▿ LineLineID: Optional("2")
      - some: "2"

I'd make a ViewModel that will be a better fit for your table view.我会制作一个更适合您的表格视图的 ViewModel。

struct LineSections {
    let lineId: String?
    let lineName: String?
    let nodes: [LineRow]
}

I guess that you have var LineRows: [LineRows] = [] somewhere, as a property of your ViewController.我猜你在某处有var LineRows: [LineRows] = []作为 ViewController 的属性。 I'd change it with var lineSections: [LineSections] = [] .我会用var lineSections: [LineSections] = []改变它。

Then,然后,

self.LineRows = food!.Linerowset?.Linerows ?? []
let rows = food?.Linerowset?.Linerows ?? []
self.lineSections = Dictionary(grouping: rows, by: { $0.lineId }).values.compactMap { LineSections(lineId: $0.first?.lineId, lineName: $0.first?.lineName, nodes: $0) }.sorted(by: { $0.lineId ?? "" < $1.lineId ?? "" }

In your table view populating:在您的表格视图中填充:

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return lineSections[section].node.count
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return lineSections.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let person = lineSections[indexPath.section].node[indexPath.row]
    cell.textLabel?.text = person.Nodename
    return cell
}

Not related: Name your var starting with a lowercase: let Cell => let cell etc.不相关:以小写字母开头命名您的 var: let Cell => let cell等。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM