加载带有JSON

时间:2016-10-04 13:09:33

标签: arrays json swift alamofire

我有一个带有TableView的页面,它用一些文本的硬编码UILabel填充每个单元格。我希望它能填满我上网的JSON中的UILabels。

故事板: enter image description here

代码:

import UIKit

class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!

var objects: NSMutableArray! = NSMutableArray()

override func viewDidLoad(){
super.viewDidLoad()

self.objects.add("iPhone")
self.objects.add("Apple Watch")
self.objects.add("Mac")
self.objects.add("Test")
self.tableView.reloadData()

}

override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func numberOfSectionsInTableView(_ tableView: UITableView) -> Int{
return 1
}

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

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

let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

cell.titleLabel.text = self.objects.object(at: (indexPath as NSIndexPath).row) as? String
//cell.logButton.tag = (indexPath as NSIndexPath).row;
//cell.logButton.addTarget(self, action: #selector(ViewController.logAction(_:)), for: .touchUpInside)
return cell
}

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: IndexPath){
self.performSegue(withIdentifier: "showView", sender: self)
}

@IBAction func logAction(_ sender: UIButton) {
let titleString = self.objects[sender.tag] as? String
let firstActivityItem = "\(titleString!)"
let activityViewController : UIActivityViewController = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)

self.present(activityViewController, animated: true, completion: nil)

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?){
if (segue.identifier == "showView"){
            let upcoming: NewViewController = segue.destination as! NewViewController

            let indexPath = self.tableView.indexPathForSelectedRow!

            let titleString = self.objects.object(at: indexPath.row) as? String

            upcoming.titleString = titleString

            self.tableView.deselectRow(at: indexPath, animated: true)
        }

    }

}

一旦进入模拟器并打开页面,TableView就会有四个单元格,其中“Label”会更改为添加到objects数组的任何内容,在这种情况下是iPhone,Apple Watch,Mac,和测试。我希望从JSON文件加载项目,而不是那些硬编码。

我对PickerView做了同样的事情,但我正在努力弄清楚如何用它来做这件事。如果有帮助的话,我的PickerView是如何完成的:

Alamofire.request(“example.com/file.json”)。responseJSON {response in

if let JSON = response.result.value as? [String:AnyObject] {


self.mypickerview.delegate = self
self.mypickerview.dataSource = self
let result = JSON.values.flatMap({ String(describing: $0) })
self.pickerData.append(contentsOf: result)
self.pickerData.sort()
self.verbose.text = "Content saved!"
self.mypickerview.reloadAllComponents()
self.mypickerview.delegate = self;
self.verbose.text = "Finished Loading!"

}
}

JSON文件:

{"One":"Mac","Two":"Apple iPhone","Three":"Test"}

2 个答案:

答案 0 :(得分:0)

1.在viewDidLoad上触发webService。 2.在Webservice完成处理程序上,检索标签值并分配给对象。 3.Reload tableview。

答案 1 :(得分:0)

你的JSON应该是这样的:

{   "标题":[     " MAC&#34 ;,     " iphone&#34 ;,     "测试"   ] }

您将执行cell.titleLabel.text = [[yourJSON valueForKey:@"titles"] objectAtIndex:indexPath.row];

之类的操作

(这是Obj-C版本,但也可以在swift中完成)

相关问题