这里我尝试使用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
}
}
答案 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解析为模型。