在 UITableview 中显示图像

Posted

技术标签:

【中文标题】在 UITableview 中显示图像【英文标题】:Display images in UITableview 【发布时间】:2017-05-01 10:16:02 【问题描述】:

我正在尝试在 tableview 中显示来自 api 的图像,但我没有得到任何图像或任何东西。 ImageTableViewCell 只有图像的出口。

import UIKit
import Alamofire
import SwiftyJSON
import Haneke

class  SlideViewController: UIViewController , UITableViewDelegate , UITableViewDataSource 

@IBOutlet weak var tableview : UITableView!

 var images = [String]()




override func viewDidLoad() 
    super.viewDidLoad()

    tableview.delegate = self
    tableview.dataSource = self

    getJSON()





func numberOfSections(in tableView: UITableView) -> Int 
    return 0



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
     return images.count




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

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


    let url = URL(string: images[indexPath.row])

    cell.images.hnk_setImage(from: url!)

    return cell





func getJSON() 

    let url =  "http://localhost:8000/api/hello"
    request(url ,  method: .get,  encoding: JSONEncoding.default  )
        .responseJSON  response in

            if let value: AnyObject = response.result.value as AnyObject? 
                //Handle the results as JSON
                do
                    if let albums = try JSONSerialization.jsonObject(with: response.data!, options: []) as? [String: Any],
                        let pics = albums["pic"] as? [Any] 

                        self.images = pics as! [String]

                        for kick in pics 
                            self.images.append(kick as! String)

                        

                    

                catch 
                    print("Error with Json: \(error)")
                
                DispatchQueue.main.async 
                    self.tableview.reloadData()
                

    
  
   

   

任何帮助将不胜感激。我尝试了很多方法,但这似乎很简单,易于跟进

【问题讨论】:

在这一行中你的应用崩溃了? self.images.append(album["pic"] as!String) 是的,你是对的@KKRocks 这一行是做什么的:self.images.append(album["pic"] as!String) 追加字符串还是追加数组? 试图将 URL 附加到“var images” 【参考方案1】:

检查下面的代码

var images = [String]()

func getJSON() 

    let url =  "http://localhost:8000/api/hello"
    request(url ,  method: .get,  encoding: JSONEncoding.default  )
        .responseJSON  response in

            if let value: AnyObject = response.result.value as AnyObject? 
                //Handle the results as JSON
                do
                    let albums = try JSONSerialization.jsonObject(with: response.data!, options:.allowFragments) as! [[String: AnyObject]]
                    print(albums)
                    if let pics = album["pic"]
                    
                       for album in pics
                       
                            images.append(album)
                       
                    

                catch 
                    print("Error with Json: \(error)")
                
                self.tableview.reloadData()

            
    

【讨论】:

cannot subscript a value of type [[String : AnyObject]] with a index of 'String' if let pics = albums["pic"] @leo0019 响应的输出是什么?你能在这里评论吗? 中的响应 成功: pic = ( "localhost:8000/images/1490104055.jpg", "localhost:8000/images/1490104055.jpg", "localhost:8000/images/1490104055.jpg", "localhost:8000/images/1490104055.jpg", "localhost:8000/images/1490104055.jpg", "localhost:8000/images/1490104055.jpg", “localhost:8000/images/1490104055.jpg”); @leo0019 尝试使用 let albums = try NSJSONSerialization.dataWithJSONObject(response, options: NSJSONWritingOptions.PrettyPrinted) 转换您的响应 cannot subscript a value of type [[String : AnyObject]] with a index of 'String' if let pics = albums["pic"]【参考方案2】:

您的 JSON 响应是 Dictionary 而不是 Array 并且其中包含 pic 数组。所以将jsonObject(with:options:) 的结果输入到[String:Any] 而不是[[String: AnyObject]]

do
    if let albums = try JSONSerialization.jsonObject(with: response.data!, options: []) as? [String: Any], 
         let pics = albums["pics"] as? [Any] 

        images = pics.flatMap $0 as? String 
    
catch 
    print("Error with Json: \(error)")

DispatchQueue.main.async 
    self.tableview.reloadData()

【讨论】:

我试过了,但它给了我一个错误,我打印了专辑 '>["pic": <__nsarrayi>( localhost:8000/images/1490104055.jpg, localhost:8000/images/1490104055.jpg, localhost:8000/images/1490104055.jpg, localhost:8000/images/1490104055.jpg, @987654325 @, localhost:8000/images/1490104055.jpg, localhost:8000/images/1490104055.jpg ) ] 致命错误:在展开可选值 (lldb) 时意外发现 nil' print(images] = [] 没有图片显示! 仍然没有图像 @leo0019 不要忘记接受我的回答,这样它也可以帮助其他有同样问题的人从 JSON 中获得响应 @leo0019 你是否在你的图像数组中得到对象,如果没有编辑你的问题使用你的实际 JSON 不要在此处添加评论【参考方案3】:

您必须至少显示一个部分。

func numberOfSections(in tableView: UITableView) -> Int 
    return 1

【讨论】:

不需要 numberofSections 方法。默认情况下,Tableview 已经有一个部分。 @leo0019 如果您只有一个部分,那么这是完全错误的答案,那么就不需要这种方法 我唯一做的就是在他的代码上显示错误。如果他愿意,他可以删除这个函数,但两者都是正确的。

以上是关于在 UITableview 中显示图像的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell textLabel 在选择时改变位置

CoreData + UIViewController + UITableView

在 iOS 的 UITableViewCell 中更新 UIButton 图像时发生冲突

如何实现(几乎)全视图 uitableview 可以滚动过去最后一个单元格并在 iOS 中显示更多元素

在 UITableview 中显示图像

iOS开发基础-UITableView控件简单介绍