使用 Swift 3 和 Alamofire 在 JSON url 中的应用程序中没有显示任何内容

Posted

技术标签:

【中文标题】使用 Swift 3 和 Alamofire 在 JSON url 中的应用程序中没有显示任何内容【英文标题】:Nothing showing in app from JSON url with Swift 3 and Alamofire 【发布时间】:2016-11-09 11:25:57 【问题描述】:

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

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"
        
    ]

【问题讨论】:

你得到了 jason 但没有在表格视图中显示数据,对吧? 正确的莫希特.. 没看到“numberOfSectionsInTableView”方法,在哪里? @Nikita Patskov。我对 swift 还很陌生,所以也许我错过了.... @rob 如果是单节,则无需添加numberOfSectionsInTableView 【参考方案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 之类的库,或者您可以创建自己的异步图像下载器。

【讨论】:

【参考方案2】:

因为您没有在表格单元格中显示 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!
    

【讨论】:

在你的重写 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 中,而不是让 mainImageView = cell?.viewWithTag(2) 为! UIImageView AND mainImageView.image = postsinput[indexPath.row].mainImage 同样的事情适用于你的标签 谢谢,但没有解决问题。但它现在解决了感谢 Repoguy

以上是关于使用 Swift 3 和 Alamofire 在 JSON url 中的应用程序中没有显示任何内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 3 拉动刷新和 Alamofire

使用 Alamofire 和 Mapkit Swift 3 请求

Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)

Swift 3 的 ObjectMapper 和 Alamofire 问题 Alamofire 4 的 Alamofire 版本

Swift 3 中的 Alamofire?

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析