我需要填充我的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
}
}
我需要这样的东西:
答案 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/,但我想你可能会在网上找到更多信息。