如何在swift中将3级数据显示到一个单独的tableview中?

时间:2016-07-19 14:11:51

标签: ios swift tableview expandablelistview

我的json数据是一个对象数组,其中对象数据的内部数组直到3个级别。我在单元格中获取了第一级json数据,在单元格中获取了第二级数据。现在如何在单个tableview中显示第三级数据?

你可以在这里看到屏幕截图

enter image description here

到现在为止只完成了两个级别。我需要像第二级一样显示第三个标签..

enter image description here

我的json数据..

[
{
"id": "244",
"name": "PIZZAS",
"image": "",
"coupon": "1",
"icon": "",
"order": "1",
"aname": "",
"options": "2",
"subcategory": [
  {
    "id": "515",
    "name": "MARGARITA",
    "description": "Cheese and Tomato",
    "image": "",
    "icon": "",
    "coupon": "1",
    "order": "1",
    "aname": "",
    "options": "2",
    "item": [
      {
        "id": "1749",
        "name": "9 Inch Thin & Crispy Margarita",
        "description": "",
        "price": "3.40",
        "coupon": "1",
        "image": "",
        "options": "2",
        "order": "1",
        "addon": "495",
        "aname": "",
        "icon": ""
      },

1 个答案:

答案 0 :(得分:0)

您可以使用UITableViewDelegate方法tableView(_:indentationLevelForRowAt:)缩进第3级。只需在您的委托中实现该方法并返回,例如20代表您的第3级行,0代表所有其他行。

更新:现在我想了解您的问题。您必须展平您的层次结构,因为表视图本身仅支持2个级别。第一级可以通过tableview部分实现(就像你已经做的那样)。然后,第二级和第三级可以实现为行,因此您必须将这些级别折叠为一个:

Pizzas                  Pizzas 
  Margaritha              Margaritha
    9InchThin             9InchThin
    12InchThin   -->      12InchThin
  BBQBasic                BBQBasic
    9InchThin             9InchThin
    12InchThin            12InchThin

就Swift实现而言,我建议使用Enum来表示扁平行:

enum ListItem {
  case TitleItem(TitleData)   // represents 2nd-level items
  case DetailItem(DetailData) // represents 3rd-level items
}

TitleData是您的模型对象包含例如“Margharita”/“Cheese and Tomato”,DetailData是包含例如“9英寸薄和脆皮Margharita”/“£3,40”的模型”。)

viewDidLoad:中为表格中的每个部分创建一个ListItem数组:为每个标题添加TitleItem,然后为所有嵌套详细信息添加DetailItem s。从tableView:numberOfRowsInSection:返回该部分中的列表项数。最后在tableView:cellForRowAtIndexPath:中返回一个单元格,具体取决于列表项的类型:

let listItem = listItemForIndexPath(indexPath)
switch listItem {
case .TitleItem(let titleData): return titleCellWithData(titleData)
case .DetailData(let detailData): return detailCellWithData(detailData)
}

...其中titleCellWithDatadetailCellWithData当然应该从表格视图中将可重复使用的单元格出列。