Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将图像从url下载到图像数组并显示在表视图中_Swift_Uiimageview - Fatal编程技术网

Swift 将图像从url下载到图像数组并显示在表视图中

Swift 将图像从url下载到图像数组并显示在表视图中,swift,uiimageview,Swift,Uiimageview,从json url获取图像时遇到问题 这是我的json: "bank_details": [ { "id": 1, "logo": "http://mortgagemarket.ae/webApi/public/mortgage_bank_icons/noorebank.png", "name": abc company } ] 我解析图像的swift代码如下: import UIKit class BanksViewContr

从json url获取图像时遇到问题

这是我的json:

"bank_details": [
    {
        "id": 1,
        "logo": "http://mortgagemarket.ae/webApi/public/mortgage_bank_icons/noorebank.png",
        "name": abc company

    }
]
我解析图像的swift代码如下:

import UIKit
class BanksViewController: UIViewController, UITableViewDelegate,UITableViewDataSource {

final let BANKS_URL = "http://www.mortgagemarket.ae/webApi/api/manage_interest_rates"
    @IBOutlet weak var tableView: UITableView!

var bankicon = [String]()
var bankname = [String]()
var bankid = [Int]()

let stringid: String = ""

override func viewDidLoad() {
    super.viewDidLoad()

    self.displayFromDb()
    tableView.dataSource = self
    tableView.delegate = self


}



func displayFromDb()
{
    let tokensp = UserDefaults.standard.string(forKey: "tokenKey")
    let url = NSURL(string: BANKS_URL+"?token="+tokensp!)

    print(url)
    URLSession.shared.dataTask(with: (url as?URL)!, completionHandler: {(data,response,error) ->
        Void in

        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary
        {

            print(jsonObj.value(forKey: "bank_details")!)

            if let messageArray = jsonObj.value(forKey: "bank_details") as? NSArray
            {
                print(jsonObj.value(forKey: "bank_details")!)

                for message in messageArray
                {
                    if let messageDict = message as? NSDictionary
                    {

                        if let data = data {


                            if let bankname = messageDict.value(forKey: "bank_name")
                            {
                                self.bankname.append(bankname as! String)
                                print(bankname)

                            }


                            if let banklogo = messageDict.value(forKey: "logo")
                            {

                                self.bankicon.append(banklogo as! String)
                                print(banklogo)

                            }

                            if let bankid = messageDict.value(forKey: "id")
                            {
                                self.bankid.append(bankid as! Int)
                                print(bankid)

                            }

                            OperationQueue.main.addOperation({
                                self.tableView.reloadData()
                            })

                        }
                    }

                }

            }

        }


    }).resume()

}


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

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

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



  cell.bankicon.image = bankicon[indexPath.row] as? UIImage
    cell.bankname.text = bankname[indexPath.row]


    return (cell)

}

}
现在,当我运行这段代码时,它显示的是空白的表格单元格。我不知道如何从url获取图像并在表格视图单元格中显示图像。请有人帮帮我。
这是我将所有json数据放入表视图单元格的全部代码。请有人帮助我

imageicon[indexPath.row]
提供一个url
String
,而不是
UIImage
的实例。您需要使用此
urlString
从服务器获取
图像

使用
URLSession
从服务器获取图像,如

if let url = URL(string: imageicon[indexPath.row]) {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let data = data {
            DispatchQueue.main.async {
                cell.imageicon.image = UIImage(data: data)
            }
        }
    }.resume()
}

您的模型应如下所示:

/// Your response models
struct BankDetails: Codable {
    let bank_details: [ImageUrl]
}

struct ImageUrl: Codable {
    let logo: String
}
func displayFromDb() {
    let tokensp = UserDefaults.standard.string(forKey: "tokenKey")
    let url = NSURL(string: BANKS_URL+"?token="+tokensp!)

    if let myUrl = url {
        URLSession.shared.dataTask(with: myUrl) { (data, response , error) in      
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let data = try decoder.decode(BankDetails.self, from: data)
            print("my logo array is: \(data.bank_details)")
            // TODO: - So you get urls 

        } catch let err {
            print("Err", err)
        }
    }.resume()
    }

}
然后在你的牢房里:

class MyCell: UITableViewCell {
    /// create dataTask for cancel in prepareForReuse function
    private var dataTask: URLSessionDataTask?

    /// Like this
    override public func prepareForReuse() {
        super.prepareForReuse()
        dataTask?.cancel()
    }

    func populate(with model: YourModel) {
        /// You should set url in indexPath of your logo array([ImageUrl])
        let url = model.url /// It's sample url for explain this is an url of your current index model
        if let imageUrl = url {
            downloaded(from: imageUrl)
        }
    }

    func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) {
        contentMode = mode
        dataTask = URLSession.shared.dataTask(with: url) { data, response, error in
            guard
                 let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                 let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else { return }
            DispatchQueue.main.async() {
                self.yourImageView.image = image
            }
        }
        dataTask?.resume()
    }
}
在控制器的tableView cellForRowAt函数中:

let model = models[indexPath.row]
cell.populate(with: model)

return cell
您可以使用上述模型,并按如下方式创建displayFromDb:

/// Your response models
struct BankDetails: Codable {
    let bank_details: [ImageUrl]
}

struct ImageUrl: Codable {
    let logo: String
}
func displayFromDb() {
    let tokensp = UserDefaults.standard.string(forKey: "tokenKey")
    let url = NSURL(string: BANKS_URL+"?token="+tokensp!)

    if let myUrl = url {
        URLSession.shared.dataTask(with: myUrl) { (data, response , error) in      
        guard let data = data else { return }
        do {
            let decoder = JSONDecoder()
            let data = try decoder.decode(BankDetails.self, from: data)
            print("my logo array is: \(data.bank_details)")
            // TODO: - So you get urls 

        } catch let err {
            print("Err", err)
        }
    }.resume()
    }

}

顺便说一句,您的JSON不是valid@Teetzjson有效json无效:
Error:Parse Error在第1行:“bank_details”:[{“logo”:“http:--------------^应为'EOF','}',,',',']“,Get':”
ack,我希望STACKOVERFLOW更有帮助。这是一个很好的问题。这不是一个推荐的方法,因为这将使kepp在滚动时多次下载相同的图像,它肯定可以保存在缓存或模型中。这完全取决于OP是否愿意这样做。问题不是缓存图像下载的图像。这不显示图像:(检查是否有任何错误。检查您使用的URL是否有效。
bank\u详细信息
logo
不是
imageURL
URL
这将无法删除。它不起作用:(@johnDoe请分享您的最终代码,以便更好地理解。我们可以一起解决此问题:)您可以创建模型结构。请检查我对@johnDoe的编辑。如果您有任何问题,请立即提问。尽情享受。