【问题标题】:Passing data from UITableViewCell从 UITableViewCell 传递数据
【发布时间】:2018-06-06 23:34:54
【问题描述】:

当我尝试将数据从我的 UITableView 传递到另一个 UIViewController 时,我遇到了一个问题。我应该如何处理我的“If”语句才能传递每个选定单元格上的数据?你们能帮我一把吗?

视图控制器:

    import UIKit

    class ViewController: UIViewController, UICollectionViewDataSource, UITableViewDataSource, UITableViewDelegate {

        @IBOutlet weak var tableViewTopSell: UITableView!
        @IBOutlet var collectionView: UICollectionView!
        @IBOutlet weak var collectionViewBanner: UICollectionView!


        var dataSource: [Content] = [Content]()
        var dataBanner: [Banner] = [Banner]()
        var dataTopSold: [Top10] = [Top10]()

        override func viewDidLoad() {
            super.viewDidLoad()
            //Delegate TableView
            self.tableViewTopSell.delegate = self
            //SetupNavBarCustom
            self.navigationController?.navigationBar.CustomNavigationBar()
            let logo = UIImage(named: "tag.png")
            let imageView = UIImageView(image:logo)
            self.navigationItem.titleView = imageView
            //CallAPIData
            getTopSold { (data) in
                DispatchQueue.main.async {
                    self.dataTopSold = data
                    self.tableViewTopSell.reloadData()
                }
            }
            getBanner { (data) in
                DispatchQueue.main.async {
                self.dataBanner = data
                self.collectionViewBanner.reloadData()
                }
            }
            getAudiobooksAPI { (data) in
                DispatchQueue.main.async {
                    self.dataSource = data
                    self.collectionView.reloadData()
                }
            }
        }
        //CollectionView
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            if (collectionView == self.collectionView) {
                return  self.dataSource.count
            }else{
                return self.dataBanner.count
            }}
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

            if (collectionView == self.collectionView) {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCell", for: indexPath) as! CollectionViewCell

            let content = self.dataSource[indexPath.item]

            cell.bookLabel.text = content.descricao
            cell.bookImage.setImage(url: content.urlImagem, placeholder: "")

            return cell

            }else if (collectionView == self.collectionViewBanner) {

                let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionViewCellBanner", for: indexPath) as! CollectionViewCell

                let content = self.dataBanner[indexPath.item]

                cell.bannerImage.setImage(url: content.urlImagem, placeholder: "")


                return cell
            }
            return UICollectionViewCell()
        }
    //TableView
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.dataTopSold.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "topSoldCell", for: indexPath) as! TableViewCell

        let content = self.dataTopSold[indexPath.item]
        cell.labelNomeTopSell.text = content.nome
        cell.imageViewTopSell.setImage(url: content.urlImagem, placeholder: "")
        cell.labelPrecoDe.text = "R$ \(content.precoDe)"
        cell.labelPrecoPor.text = "R$ 119.99"
        return cell
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        performSegue(withIdentifier: "segueId", sender:self.dataTopSold[indexPath.item])

        }

        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

            if segue.identifier == "segueId" {

                let des = segue.destination as! TelaDetalheProdutos

                des.stringNomeeDesc = sender as? String

            }
        }

    }

extension UIImageView{
    func setImage(url : String, placeholder: String, callback : (() -> Void)? = nil){
        self.image = UIImage(named: "no-photo")

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

            guard error == nil else{
                return
            }
            DispatchQueue.main.async(execute: { () -> Void in
                let image = UIImage(data: data!)
                self.image = image

                if let callback = callback{
                    callback()
                }


            })

        }).resume()
    }
}

有声书文件:

import Foundation

//Categorias
struct Contents : Decodable {
    let data : [Content]
}
struct Content : Decodable {
    let id : Int
    let descricao : String
    let urlImagem : String
}
//Banner
struct BannerData : Decodable {
    let data : [Banner]
}
struct Banner : Decodable {
    let id : Int
    let urlImagem : String
    let linkUrl : String
}
//Top10
struct Top10Data:Decodable {
    let data: [Top10]
}
struct Top10:Decodable {
    let id : Int
    let nome : String
    let urlImagem : String
    let descricao : String
    let precoDe : Int
}

详细视图控制器:

import UIKit

class TelaDetalheProdutos: UIViewController {
    //Properties
    @IBOutlet weak var ImageView: UIImageView!
    @IBOutlet weak var labelNomeEDesc: UILabel!
    @IBOutlet weak var labelDe: UILabel!
    @IBOutlet weak var labelPor: UILabel!
    @IBOutlet weak var labelNomeProduto: UILabel!
    @IBOutlet weak var labelDescricao: UILabel!
    //Strings
    var stringImageView = String()
    var stringNomeeDesc = String()
    var stringLabelDe = String()
    var stringLabelPor = String()
    var stringNomeProduto = String()
    var stringlabeDescricao = String()

    override func viewDidLoad() {
        super.viewDidLoad()

    ***//What should I do here?***

    }

}

[编辑 1]:

我正在这样做,但我遇到了这个崩溃:

无法将类型“Top10”的值分配给类型“String”

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

    let content = self.dataTopSold[indexPath.item]
    cell.labelNomeTopSell.text = content.nome
    cell.imageViewTopSell.setImage(url: content.urlImagem, placeholder: "")
    cell.labelPrecoDe.text = "R$ \(content.precoDe)"
    cell.labelPrecoPor.text = "R$ 119.99"
    return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    performSegue(withIdentifier: "segueId", sender:self.dataTopSold[indexPath.row])

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

         if segue.identifier == "segueId" {

        let des = segue.destination as! TelaDetalheProdutos

        des.stringNomeeDesc = sender as! Top10
    }
}

[Edit 3] -SOLVED - 发生的事情是在 Storyboard 中我将 UITableViewCell 链接到另一个屏幕而不是链接 ViewController .这就是它出现两次的原因。

当屏幕在选择单元格后进行转换时,包含结果的下一个屏幕会自动出现两次。第一次它有空字段,并且在 1 秒或更短时间后,会再次自动转换,但这次包含我传递的所有数据。当我单击“返回”TopBar 按钮时也会发生同样的情况。可能会发生什么?

【问题讨论】:

  • 将选定的indexPath 传递为sender 而不是self 然后您可以在prepareFor 中使用它从您的模型中获取相关对象并将其设置为属性你的目标视图控制器
  • 你好@Paulw11!等一下。那么,我通过 indexPath 还是 IndexPath.row?之后,if语句如何说:cell.labelName.text等?
  • 您可以传递 indexPath 或行。只要您在prepareFor 中正确地贬低它,这并不重要。您可以从self.dataTopSold 获取相关对象
  • 首先,不要使用item,在处理表格时使用row。二、数组中对象的类型是什么?它们不是字符串,因此强制向下转换为字符串会崩溃。将其转换为正确的对象类
  • 明白了!数组中的对象类型都是字符串,只有一个是 Int。我刚刚使用完整的 UIViewController 文件以及包含我所有结构的 AudioBook 文件更新了帖子。请检查一下好吗?

标签: ios swift uitableview segue


【解决方案1】:

你可以试试

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

    performSegue(withIdentifier: "segueId", sender:self.dataTopSold[indexPath.row])

}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "segueId" {

        let des = segue.destination as! TelaDetalheProdutos

        des.item = sender as! Top10
    }
}

//

class TelaDetalheProdutos: UIViewController {

   var item:Top10?

}

【讨论】:

  • 您好!哦,等一下。我明白你所做的一切,除非最后一部分。所以,我应该说:des。 stringNomeeDesc = 发件人为! (作为什么?)。我怎么知道我是否通过了牢房。 labelNomeTopSell 还是等等?
  • What 替换为数组 dataTopSold 的数据类型,就像声明字符串数组 [String] 时一样 - > 你的数组中的 String 可能是 struct 或类类型替换它,你实际上没有传递单元格,而是传递模型或数组项中显示的单击时的单元格 didSelectRowAt indexPath.row 表示单击的单元格当前显示的数组的索引
  • @BrunoVavretchek 发布 dataTopSold 的声明
  • 我会发帖的,请稍等
  • 伙计,非常感谢!是的,我忘了声明 var item:Top10。现在我刚刚在 Details View DidLoad 上说:labelNomeProduto.text = item?.nome 我要填充,它工作得很好!
【解决方案2】:

将选定的索引路径保存在选择中

在为 segue 做准备时,获取数据并将其传递给 DetailViewController

//in prepare for segue
let content = self.dataTopSold[indexPath.item]
//cast segue.destination controller to DetailViewController and pass content
guard let detailViewController = segue.destinationViewController as? DetailViewController else {return}
detailViewController.content = content

【讨论】:

  • 非常感谢您帮助我,伙计!我必须修复它
猜你喜欢
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多