ios - 单击表格 View 单元格时将图像传递到另一个 View 。该图像是从 json 数据中获取并使用 alamofire 初始化的

标签 ios swift xcode tableview

我正在从 url 中获取 json 数据并将其显示在 tableview 中。单击 tableview 单元格时,我想将 tableview 中的图像显示到另一个 View Controller 。我的另一个标签正在显示但不知道如何在 tableview 的 didselectrowatindexpath 方法中为图像编写代码

我的代码:

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

    //getting hero for specified position
    let hero: Hero
    hero = heroes[indexPath.row]

    //displaying values
    cell.labelName.text = hero.name
    cell.labelTeam.text = hero.team
    cell.labelRealName.text = hero.realname
    cell.labelAppear.text = hero.firstappearance
    cell.labelPublish.text = hero.publisher

    //displaying image
    Alamofire.request(hero.imageUrl!).responseImage { (response) in
        debugPrint(response)

        if let image = response.result.value {
            cell.heroImage.image = image
        }
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let heroesDetails:HeroesDetailsViewController = self.storyboard?.instantiateViewController(withIdentifier: "HeroesDetailsViewController") as! HeroesDetailsViewController

    heroesDetails.strlabelTeam = heroes[indexPath.row].team
    heroesDetails.strlabelName = heroes[indexPath.row].name
    heroesDetails.strlabelAppear = heroes[indexPath.row].firstappearance
    heroesDetails.strlabelPublish = heroes[indexPath.row].publisher
    heroesDetails.strlabelRealName = heroes[indexPath.row].realname

    self.navigationController?.pushViewController(heroesDetails, animated: true)
}

我想在其中显示代码的 herosdetailviewcontroller 文件:

import UIKit

class HeroesDetailsViewController: UIViewController {


    @IBOutlet weak var detailsImg: UIImageView!
    @IBOutlet weak var detailsName: UILabel!
    @IBOutlet weak var detailsRealName: UILabel!
    @IBOutlet weak var detailsTeam: UILabel!
    @IBOutlet weak var detailsAppear: UILabel!
    @IBOutlet weak var detailsPublisher: UILabel!

    var strheroImage: UIImage!
    var strlabelName: String!
    var strlabelTeam: String!
    var strlabelAppear: String!
    var strlabelPublish: String!
    var strlabelRealName: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        detailsImg.image = strheroImage
        detailsName.text = strlabelName
        detailsRealName.text = strlabelRealName
        detailsTeam.text = strlabelTeam
        detailsAppear.text = strlabelAppear
        detailsPublisher.text = strlabelPublish


        // Do any additional setup after loading the view.
    }

}

我的模态文件:

class Hero{
    var name:String?
    var team:String?
    var imageUrl:String?
    var realname:String?
    var firstappearance:String?
    var publisher:String?

    init(name:String?, team:String?, imageUrl:String?, realname:String?, firstappearance:String?, publisher:String?) {
        self.name = name
        self.team = team
        self.imageUrl = imageUrl
        self.realname = realname
        self.firstappearance = firstappearance
        self.publisher = publisher
    }
}

我的 tableviewcell.swift 文件:

import UIKit

class TableViewCell: UITableViewCell {

    @IBOutlet weak var heroImage: UIImageView!
    @IBOutlet weak var labelName: UILabel!
    @IBOutlet weak var labelTeam: UILabel!
    @IBOutlet weak var labelAppear: UILabel!
    @IBOutlet weak var labelPublish: UILabel!
    @IBOutlet weak var labelRealName: UILabel!

    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
    }

}

包含所有代码的我的主 viewcontroller.swift 文件:

import UIKit
import Alamofire
import AlamofireImage

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{

    //MARK: IBOUTLETS
    @IBOutlet weak var tableviewHeroes: UITableView!

    // Web API Url
    let URL_GET_DATA = "https://simplifiedcoding.net/demos/marvel/"

    // List to store Heroes
    var heroes = [Hero]()

    //implementing uirefreshcontrol to tableview
    lazy var refreshControl: UIRefreshControl = {
        let refreshControl = UIRefreshControl()
        refreshControl.addTarget(self, action: #selector(ViewController.handleRefresh), for: .valueChanged)
        refreshControl.tintColor = UIColor.init(red: 217/255, green: 133/255, blue: 199/255, alpha: 1)
        return refreshControl
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableviewHeroes.addSubview(self.refreshControl)

        //fetching data from web api
        Alamofire.request(URL_GET_DATA).responseJSON { (response) in

            //getting json
            if let json = response.result.value {

                //converting json to NSArray
                let heroesArray:NSArray = json as! NSArray

                //traversing through all elements of the array
                for i in 0..<heroesArray.count {

                        //adding heroes value to hero list
                    self.heroes.append(Hero(
                        name: (heroesArray[i] as AnyObject).value(forKey: "name") as? String, team: (heroesArray[i] as AnyObject).value(forKey: "team") as? String, imageUrl: (heroesArray[i] as AnyObject).value(forKey: "imageurl") as? String,
                        realname: (heroesArray[i] as AnyObject).value(forKey: "realname") as? String, firstappearance: (heroesArray[i] as AnyObject).value(forKey: "firstappearance") as? String, publisher: (heroesArray[i] as AnyObject).value(forKey: "publisher") as? String ))
                }

                //display data in tableview
                self.tableviewHeroes.reloadData()

            }
        }
        self.tableviewHeroes.reloadData()
    }

    func handleRefresh(refreshControl: UIRefreshControl) {
        self.tableviewHeroes.reloadData()
        refreshControl.endRefreshing()

    }

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

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

        //getting hero for specified position
        let hero: Hero
        hero = heroes[indexPath.row]


        //displaying values
        cell.labelName.text = hero.name
        cell.labelTeam.text = hero.team
        cell.labelRealName.text = hero.realname
        cell.labelAppear.text = hero.firstappearance
        cell.labelPublish.text = hero.publisher

        //displaying image
        Alamofire.request(hero.imageUrl!).responseImage { (response) in
            debugPrint(response)

            if let image = response.result.value {
                cell.heroImage.image = image
            }
        }
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let heroesDetails:HeroesDetailsViewController = self.storyboard?.instantiateViewController(withIdentifier: "HeroesDetailsViewController") as! HeroesDetailsViewController

        let hero: Hero
        hero = heroes[indexPath.row]

        let image : UIImage = UIImage(data: hero.imageUrl)

        heroesDetails.strlabelTeam = heroes[indexPath.row].team
        heroesDetails.strlabelName = heroes[indexPath.row].name
        heroesDetails.strlabelAppear = heroes[indexPath.row].firstappearance
        heroesDetails.strlabelPublish = heroes[indexPath.row].publisher
        heroesDetails.strlabelRealName = heroes[indexPath.row].realname
        heroesDetails.strheroImage = image

        self.navigationController?.pushViewController(heroesDetails, animated: true)
    }


}

最佳答案

您应该使用缓存策略,而不是将下载的图像从一个 VC 传递到另一个。较大的图像可能需要时间来下载,用户不能在点击表格 View 单元格之前等待它。 有关详细信息,请参阅图像缓存部分 https://github.com/Alamofire/AlamofireImage

关于ios - 单击表格 View 单元格时将图像传递到另一个 View 。该图像是从 json 数据中获取并使用 alamofire 初始化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55740486/

相关文章:

c# - 是否有人使用 MonoTouch 实现了等效的 StackPanel?

ios - 如何通过 AFNetworking 为特定域设置可达性测试?

升级到 5 后 iOS Facebook 登录不起作用

ios - SwiftUI ButtonStyle - 如何检查按钮是否已禁用或启用?

ios - 如何在另一个 NavigationLink 中包含一个 NavigationLink

ios - 错误 : unrecognized selector sent to instance - Using Camera with OverlayView

ios - 数组内的 JSON 数组

objective-c - 如何更改 "System Preferences > Keyboard > Modifier Keys..."中的修改键

ios - 如何在 osx 计算机中将 Apple 配置文件从一个用户传输到另一个用户?

iphone - MBProgressHUD 和执行选择器问题 - iphone