【问题标题】:Pass data from tableView cell is tap to second tableView从 tableView 单元格传递数据被点击到第二个 tableView
【发布时间】:2021-08-30 03:36:33
【问题描述】:

当单元格被点击到 detailTableView 时,我正在尝试从 tableView 传递数据。加载详细信息表视图时,我没有收到任何错误。 segue 正在执行,但是 tableView 保持空白。我的目标是将颜色添加到单元格中的 textLabel 中,并将 zord 添加到同一单元格中的 detailTextLabel 中。谁能告诉我我做错了什么

// My data
struct PowerRangerData {
    let name: String
    let rangerColor: String
    let zord: String
}
// Intial vc

class DisplayVC: UIViewController {
    
    @IBOutlet weak var table_View: UITableView!
    
    var rangerArray = [
        PowerRangerData(name: "Jason", rangerColor: "Gold ranger", zord: "Pyramidas Zord"),
        PowerRangerData(name: "Tommy", rangerColor: "Green ranger", zord: "Dragon Zord"),
        PowerRangerData(name: "Nick", rangerColor: "Red ranger", zord: "Phoenix Zord"),
        PowerRangerData(name: "Kira", rangerColor: "Yellow ranger", zord: "Pteranodon Zord"),
        PowerRangerData(name: "Jen", rangerColor: "Pink ranger", zord: "Time flyer 5"),
        PowerRangerData(name: "Sky", rangerColor: "Blue ranger", zord: "Delta Runner 2")
    ]
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        table_View.dataSource = self
        table_View.delegate = self
    }
    
}

    

extension DisplayVC: UITableViewDelegate {
    
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            
            if segue.identifier == "detailSegue" {
                
                if let index_path = self.table_View.indexPathForSelectedRow {
                    
                    let detailVC = segue.destination as! DetailVC
                    
                    detailVC.color = rangerArray[index_path.row].rangerColor
                    
                    detailVC.zord = rangerArray[index_path.row].zord
                }
                
            }

        }
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        table_View.deselectRow(at: indexPath, animated: true)
        
        performSegue(withIdentifier: "detailSegue", sender: self)
        
    }
    
}

extension DisplayVC: UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return rangerArray.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = table_View.dequeueReusableCell(withIdentifier: "cellId", for: indexPath)
        
        cell.textLabel?.text = rangerArray[indexPath.row].name
        
        return cell
    }
    
    
}
// DetailVC

class DetailVC: UIViewController {
        
    @IBOutlet weak var detailTableView: UITableView!
    
    var color = ""
    var zord = ""
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        detailTableView.delegate = self
        detailTableView.dataSource = self
        
    }

}

extension DetailVC: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        detailTableView.deselectRow(at: indexPath, animated: true)
    }
}

extension DetailVC: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let rangerData: [String] = [color, zord]
        return rangerData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = detailTableView.dequeueReusableCell(withIdentifier: "detailId", for: indexPath)
        
        cell.textLabel?.text = color
        cell.detailTextLabel?.text = zord
            
        return cell
    }
    
    
}


【问题讨论】:

    标签: ios swift storyboard segue


    【解决方案1】:

    这里的顺序可能很重要performSegue 应该在deselectRow 之前,以便if let index_path = self.table_View.indexPathForSelectedRow { 有一个值

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
        performSegue(withIdentifier: "detailSegue", sender: self) 
        table_View.deselectRow(at: indexPath, animated: true)  
    }
    

    另外prepare 应该在extension DisplayVC { 下而不是extension DisplayVC: UITableViewDelegate {

    【讨论】:

    • 是的,没错。顺序确实很重要。谢谢!!。但是,数据在 detailVC 中出现了两次。正在创建两个单元格。关于如何防止这种情况的任何建议?
    • return rangerData.count 替换为返回1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多