使用Swift 3和Alamofire

时间:2016-11-09 11:25:58

标签: ios json swift swift3

我有一个使用Swift 3和Alamofire的应用。数据连接到两个cell?.viewWithTag(2)cell?.viewWithTag(1),这是一个图像(来自网址)和文本。所以当我运行项目时,我的应用程序中没有显示任何内容。我已经使用print(readableJSON)测试了JSON,并且JSON正在打印到控制台中。所以我真的有点困惑。我的快速看起来像这样:

SWIFT

import UIKit
import Alamofire

struct postinput {
    let mainImage : UIImage!
    let name : String!

}


class TableViewController: UITableViewController {

    var postsinput = [postinput]()

    var mainURL = "https://www.example.api.com"

    typealias JSONstandard = [String : AnyObject]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        callAlamo(url: mainURL)
    }

    func callAlamo(url : String){
        Alamofire.request(url).responseJSON(completionHandler: {
            response in

            self.parseData(JSONData: response.data!)


        })

    }

    func parseData(JSONData : Data) {
        do {
            var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONstandard
        print(readableJSON)

            if let posts = readableJSON["posts"] as? [JSONstandard] {
                for post in posts { 
                    let title = post["title"] as! String
                    print(title)

                    if let imageUrl = post["image"] as? JSONstandard {
                        let mainImageURL = URL(string: imageUrl["url"] as! String)
                        let mainImageData = NSData(contentsOf: mainImageURL!)


                        let mainImage = UIImage(data: mainImageData as! Data)
                        postsinput.append(postinput.init(mainImage: mainImage, name: title))
                        self.tableView.reloadData()

                    }


                }

            }

        }


        catch {
            print(error)
        }


    }




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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

        // cell?.textLabel?.text = titles[indexPath.row]

        let mainImageView = cell?.viewWithTag(2) as! UIImageView

        mainImageView.image = postsinput[indexPath.row].mainImage

        let mainLabel = cell?.viewWithTag(1) as! UILabel

        mainLabel.text = postsinput[indexPath.row].name


        return cell!
    }

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


}

JSON

{
    "posts" : [{
        "id": "000000",
        "url": "/content/interview2",
        "date": "2016-11-03 09:01:41",
        "modified": "2016-11-03 09:03:47",
        "title": "An interview",
        "image": "https://www.example.com/sites/default/files/oregood.jpeg",
        "summary": {
            "value": "<p>Latin text here</p>",
            "format": "filtered_html"
        }
    }]
}

2 个答案:

答案 0 :(得分:1)

从您的JSON回复image密钥包含String而不是Dictionary,您还需要在循环内部重新加载tableView外循环,所以请尝试这样

if let posts = readableJSON["posts"] as? [JSONstandard] {
    for post in posts {
        let title = post["title"] as! String            
        if let imageUrl = post["image"] as? String {
            let mainImageURL = URL(string: imageUrl as! String)
            let mainImageData = NSData(contentsOf: mainImageURL!)
            let mainImage = UIImage(data: mainImageData as! Data)
            postsinput.append(postinput.init(mainImage: mainImage, name: title))                
        }
    }
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

建议:而不是在主线程击球手上使用NSData(contentsOf:)下载图像以使用SDWebImages之类的库,或者您可以创建自己的异步图像下载器。

答案 1 :(得分:0)

因为您没有在表格单元格中显示JSON。您创建一个名为“mainImageView”的复制对象,并且永远不会将其指定为表格单元格的实际imageView,而是尝试:

(cell?.viewWithTag(2) as? UIImageView).image = postsinput[indexPath.row].mainImage

postsinput包含图片字符串或图片?

编辑: 所以它会是:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")

        // cell?.textLabel?.text = titles[indexPath.row]

        //let mainImageView = cell?.viewWithTag(2) as! UIImageView

        //mainImageView.image = postsinput[indexPath.row].mainImage
        (cell?.viewWithTag(2) as? UIImageView).image = postsinput[indexPath.row].mainImage

        //let mainLabel = cell?.viewWithTag(1) as! UILabel

        //mainLabel.text = postsinput[indexPath.row].name
        (cell?.viewWithTag(1) as? UILabel).text = postsinput[indexPath.row].name

        return cell!
    }