使用JSON数据填充tableView

时间:2016-07-15 09:43:13

标签: ios json swift

这里我尝试使用JSON数据加载表视图但数据没有显示。我不知道问题出在哪里我认为我没有正确地将数据输入阵列。很多但是没有得到我做错了。新到了iOS。

以下是我的 JSON数据:

  

{ “total_images_count”:266, “datetime_value”:“2016年7月15日   19点28分37" 秒, “total_count_response”: “”, “IMAGE_PATH”: “http://www.expert.com/test/images/”, “任务”:[{ “IMAGE_NAME”: “文件1”,” IMAGE_PATH “:” 1461468362622.jpg “},{” IMAGE_NAME “:” 文件2" , “IMAGE_PATH”: “1461468362622.jpg”},

 class ViewController:    UIViewController,UITableViewDelegate,UITableViewDataSource {

var arrDict :NSMutableArray = NSMutableArray()

override func viewDidLoad() {

    super.viewDidLoad()

     jsonParsingFromURL()

}

func jsonParsingFromURL () {
     let url = NSURL(string: "http://clipbyte.com/ontest/cron/webapi.php?task=webapi.getAllClips")

     let request = NSURLRequest(URL: url!)

     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in
        self.startParsing(data!)
    }
}

func startParsing(data :NSData)
{
    let dict: NSDictionary!=(try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
    for var i = 0 ; i < (dict.valueForKey("task") as! NSArray).count ; i++
    {
        arrDict.addObject((dict.valueForKey("task") as! NSArray) .objectAtIndex(i))
    }

    NSLog("array is ", arrDict)
}


func numberOfSectionsInTableView(tableView: UITableView) -> Int
{
    return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return arrDict.count
}

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

    let cell : UITableViewCell! = tableView.dequeueReusableCellWithIdentifier("Cell")

    let strTitle : NSString=arrDict[indexPath.row] .valueForKey("clip_name") as! NSString

    cell.textLabel!.text=strTitle as String
    cell.imageView?.image = arrDict[indexPath.row].valueForKey("clip_image_path") as? UIImage
    return cell

}

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


}

如果我将以下类用于自定义单元格,则会在IBOutlet

下面的init函数中出现错误

TableViewCell类

class TableViewCell: UITableViewCell
 {
@IBOutlet weak var lblTitle: UILabel!
@IBOutlet weak var lbDetails: UILabel!

init(style: UITableViewCellStyle, reuseIdentifier: String) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
// Initialization code
}
 override func awakeFromNib() {
 super.awakeFromNib()

// Initialization code
}

 override func setSelected(selected: Bool, animated: Bool) {
 super.setSelected(selected, animated: animated)
 // Configure the view for the selected state
}
}

1 个答案:

答案 0 :(得分:0)

编写一个函数来在主线程上运行闭包:

typealias Closure = () -> Void
func runOnMain(closure: Closure) {
    dispatch_async(dispatch_get_main_queue(), {
        () -> Void in
        closure()
    })
}

然后在您的方法startParsing

通过重新加载tableView完成:

func startParsing(data :NSData)
{
    let dict: NSDictionary!=(try! NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)) as! NSDictionary
    for var i = 0 ; i < (dict.valueForKey("task") as! NSArray).count ; i++
    {
        arrDict.addObject((dict.valueForKey("task") as! NSArray) .objectAtIndex(i))
    }

    NSLog("array is ", arrDict)
    runOnMain {
        self.tableView.reloadData()
    }
}

编辑: 一个提示是创建一个没有任何类的Macros.swift文件,并将runOnMain方法和typealias放在该文件中。这样,该方法可以从项目的任何位置访问。

另外,你应该真正从你的JSON创建模型。我建议你看一下使用Alamofire获取数据的open source project并将JSON解析为模型。