我从远程服务器收到JSON文件,我可以在标签中显示结果。当我调用函数processJSONData()
时,JSON数据工作正常,并且tableview适用于一个简单的数组。如何将两者合并以显示tableview中JSON文件的结果?请查看下面的代码并进行编辑。非常感谢:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var countryLabel: UILabel!
@IBOutlet weak var capitalLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
//processJSONData()
self.myTableView.registerClass(UITableViewCell.self,forCellReuseIdentifier: "cell")
self.myTableView.dataSource = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func processJSONData(){
let urlPath = "http://dubaisinan.host22.com/service1.php"
let url : NSURL = NSURL(string: urlPath)!
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url,completionHandler: {(data, respose, error) -> Void in
if error != nil {
println(error)
}
else {
self.abc(data)
}
})
task.resume()
}
func abc(data:NSData)
{
var parseError: NSError?
let result:AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &parseError);
if(parseError == nil){
if let dictResult = result as? NSArray{
dispatch_async(dispatch_get_main_queue()) {
self.countryLabel.text = dictResult[2]["Capital"] as? String
}
}
}
}
@IBOutlet weak var myTableView: UITableView!
var items = ["One","Two", "Three","Four"]
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.myTableView
.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
cell.textLabel?.text = self.items[indexPath.row]
return cell
}
}
答案 0 :(得分:2)
我没有看到你将解析结果分配给全球"项目"并在任何地方使用新数据重新加载tableview。
可以在这里完成
if let dictResult = result as? NSArray{
self.items = dictResult
self.myTableView.reloadData()
///the rest of the code
}
答案 1 :(得分:1)
您必须将JSON数据保存到类级变量中,您将在任何函数之外定义该变量,类似于您定义“items”的方式。假设您有一个具有每个资本的国家/地区列表,这可能是这样的:
var countryAndCapitalData = [(country: String, capital: String)]()
这可以通过首先定义一个包含数据的结构来改进:
struct CountryInfo
{
name: String
capital: String
init(name:String, capital:String)
{
self.name = name
self.capital = capital
}
}
允许您将数据数组定义为CountryInfo数组:
var countryAndCapitalData = [CountryInfo]()
然后在你的“abc”函数中(我坚持你重命名为processCountryData),在countryAndCapitalData中存储国家名+资本名字符串对。例如:
countryAndCapitalData.append(CountryInfo(countryName, capitalName))
使用For循环遍历dictResult中的值。创建countryName和capitalName取决于JSON的结构,但是从您的示例中可能看起来像这样:
for countryDictionary in dictResult[2]
{
if let countryName = countryDictionary["country"], let capitalName = countryDictionary["capital"]
{
countryAndCapitalData.append(CountryInfo(countryName, capitalName))
}
}
然后在tableView.cellForRowAtIndexPath中,使用countryAndCapitalData[indexPath.row].name
和countryAndCapitalData[indexPath.row].capital
填充单元格标签。
最后,请务必在循环后重新加载表格(感谢Eugene):
dispatch_async(dispatch_get_main_queue()) {
self.myTableView.reloadData()
}
为任何编译错误道歉,因为我是从Windows机器输入的。
答案 2 :(得分:1)
您应该在items
方法调用中更新abc
属性,然后刷新表格:
func abc(data: NSData) {
// Do something with data
items = .. // processed data
}
var items: [String]? {
didSet {
NSOperationQueue.mainQueue.addOperationWithBlock {
self.tableView.reloadData()
}
}
}