如何用多维json填充我的TableView

时间:2015-12-16 11:21:22

标签: ios swift

我需要填充我的TableView,并将单元格自定义为:

  

点击Cell Services打开两个nivels,社会服务和其他服务,当我点击其中一个时,他们会自动拨打该号码。

我有这个json回复:

var phones = {
   "services": [
            {
                  "id": "1",
                  "nome": "Social Service",
                  "numero": "9999-6666"
            },
            {
                  "id": "2",
                  "nome": "Other Service",
                  "numero": "9999-7777"
            }
   ],
   "directorship": [
            {
                  "id": "3",
                  "nome": "Directorship 1",
                  "numero": "9999-8888"
            },
            {
                  "id": "4",
                  "nome": "Directorship 2",
                  "numero": "9999-9999"
            }
   ]
};

我正在使用Alamofire + SwiftJson,在非维json工作正常,我想我需要改变我的但我不知道如何:

我的请求示例:

import UIKit
import Alamofire
import SwiftyJSON

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
  var texto: [String] = []@ IBOutlet weak
  var table: UITableView!

    override func viewWillAppear(animated: Bool) {
      self.table.reloadData()
    }

  override func viewDidLoad() {
    super.viewDidLoad()
    table.delegate = self
    table.dataSource = self

    loadPosts()
  }

  func loadPosts() {
    let url = "http://puc.vc/painel/webservice/telefones/"
    Alamofire.request(.GET, url)
      .responseJSON {
        response in

          if
        let value: AnyObject = response.result.value {
          let post = JSON(value)
          for (_, subJson) in post {
            self.texto.append(subJson.stringValue)
          }
        }

        dispatch_async(dispatch_get_main_queue(), {
          self.table!.reloadData()
        })
      }
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }

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

  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {
    let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel ? .text = self.texto[indexPath.row]
    print(self.texto[indexPath.row])
    return cell
  }

}

我需要这样的东西:

enter image description here

1 个答案:

答案 0 :(得分:1)

查看图像,您需要UITableView部分。我会提供一些天真的例子,它很容易出错,但这只是一个提示,所以我希望你能加强它。

phones是一个包含两个键“services”和“directorhip”的字典,我们将使用这个事实并期望它始终是真的,在这些键后面是具有三个键值对的字典数组。为简单起见,我们将有两个字典数组,一个用于服务,一个用于管理。首先,我们需要提取它们:

let post = JSON(value)
let services = post["services"] // put it into self.services
let directorship = post["directorship"] // put it into self.directorship

请注意,在现实世界中,它们可能会丢失或类型无效(例如,字符串而不是数组),我不会考虑到这一点。

然后我们使用这样的数组:

// We tell that we have two sections in our table view (services+directorship)
override func numberOfSectionsInTableView(tableView: UITableView)
    -> Int {
    return 2 
}

// Then we return appropriate number of rows for each sections
override func tableView(tableView: UITableView,
    numberOfRowsInSection section: Int)
    -> Int {
    if section == 0
    {
        return self.services.count
    }
    else
    {
        return self.directorship.count
    }
}

// Configure cells appropriately
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) - > UITableViewCell {
    let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell

    if section == 0
    {
        cell.textLabel ? .text = self.services[indexPath.row]["nome"]
    }
    else
    {
        cell.textLabel ? .text = self.directorship[indexPath.row]["nome"]
    }
    return cell
}

// return appropriate section header title
override func tableView(tableView: UITableView,
    titleForHeaderInSection section: Int)
    -> String {
    if section == 0
    {
        return "Services"
    }
    else
    {
        return "Directorship"
    }
}

请注意,我希望你不要只复制粘贴那些代码(它无法正常工作,我更加objc并在浏览器中编写),但阅读并分析。

在现实世界中,最好为您的表视图创建模型(即类似“服务”的电话,名称和ID),在其他地方提取与Web相关的逻辑,使用该Web逻辑获取“json”,转换它到您的模型(再次在一些单独的类,如“MySuperModel”),并将该模型提供给您的tableView。快速搜索给了我这个:http://www.pumpmybicep.com/2014/07/04/uitableview-sectioning-and-indexing/,但我想你可能会在网上找到更多信息。