无法在我的 TableView 中显示自定义单元格文件?

Posted

技术标签:

【中文标题】无法在我的 TableView 中显示自定义单元格文件?【英文标题】:Fail to display the custom cell file in my TableView? 【发布时间】:2021-02-18 14:16:18 【问题描述】:

我制作了一个 NIB 自定义单元格文件,但我根本无法在我的 tableView 中显示自定义单元格文件。该代码没有错误并且可以运行,但我正在努力显示自定义单元格。我最初认为我的问题来自我创建的 Unwind Segue,它是为了将数据从 InputScreen 传递到 ViewController,但我只是不确定此时可能是什么问题?

非常感谢任何帮助。

主视图控制器


class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource 
    
    @IBOutlet weak var tableView: UITableView!
    
    var IzParcelz = [IzParcel]()
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        let nib = UINib(nibName: "IzparcelCell", bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: "IzparcelCell")
        tableView.delegate = self
        tableView.dataSource = self
    
    // MARK: - TableView data source
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return IzParcelz.count
    
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "IzparcelCell", for: indexPath) as! IzparcelCell
   
        let izPackage = IzParcelz[indexPath.row]
        cell.nameLabel.text = izPackage.name
        cell.addressLabel.text = izPackage.address
        cell.trackingNumLabel.text = izPackage.trackingNumber

        return cell
    
    // MARK: - TableView Delegate
    
    func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool 
        return true
    
    
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) 
        if editingStyle == .delete 
            IzParcelz.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            IzParcel.saveIzParcel(IzParcelz)
            
        
    

    @IBAction func prepareForUnwind(segue: UIStoryboardSegue) 

        guard segue.identifier == "saveUnwind" else  return 
        
        let sourceViewController = segue.source as! InputViewController
        
        if let P = sourceViewController.izParcel 
            if let selectedIndexPath = tableView.indexPathForSelectedRow 
                IzParcelz[selectedIndexPath.row] = P
                tableView.reloadRows(at: [selectedIndexPath], with: .none)
             else 
                let newIndexPath = IndexPath(row: IzParcelz.count, section: 0)
                IzParcelz.append(P)
                tableView.insertRows(at: [newIndexPath], with: .automatic)
            
        
        
        IzParcel.saveIzParcel(IzParcelz)
    
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "showDetails" 
            let izViewController = segue.destination as! InputViewController
            let indexPath = tableView.indexPathForSelectedRow!
            let selectedTodo = IzParcelz[indexPath.row]

            izViewController.izParcel = selectedTodo
        
    
 

输入视图控制器

import UIKit

class InputViewController: UITableViewController 
    
    var izParcel: IzParcel?
    
    @IBOutlet weak var statusTextLabel: UITextField!
    
    @IBOutlet weak var nameTextLabel: UITextField!
    @IBOutlet weak var addressTextLabel: UITextField!
    @IBOutlet weak var trackingNumTextLabel: UITextField!
    
    @IBOutlet weak var notesTextLabel: UITextField!
    
    @IBOutlet weak var statusUpdateTextLabel: UIDatePicker!
    @IBOutlet weak var dateAndTimeTextLabel: UIDatePicker!
    
    @IBOutlet weak var saveButton: UIButton!
    
    override func viewDidLoad() 
        super.viewDidLoad()
        
        if let izParcels = izParcel 
            nameTextLabel.text = izParcels.name
            addressTextLabel.text = izParcels.address
            trackingNumTextLabel.text = izParcels.trackingNumber
            notesTextLabel.text = izParcels.notes
            dateAndTimeTextLabel.date = izParcels.dateAndTime
            statusUpdateTextLabel.date = izParcels.statusUpdated
        
    
    
    @IBAction func deleteButton(_ sender: UIButton) 
        self.dismiss(animated: true, completion: nil)
    
    
    @IBAction func saveButton(_ sender: UIButton) 
        print("PressedButtttonnnnTesst")
        self.performSegue(withIdentifier: "saveUnwind", sender: self)

        func prepare(for segue: UIStoryboardSegue, sender: Any?) 
            guard segue.identifier == "saveUnwind" else  return 
            
            let name = nameTextLabel.text!
            let address = addressTextLabel.text!
            let trackingNumber = trackingNumTextLabel.text!
            let notes = notesTextLabel.text!
            let dates = dateAndTimeTextLabel.date
            let statusUpdate = statusUpdateTextLabel.datePickerMode
            
            izParcel = IzParcel(name: name, address: address, trackingNumber: trackingNumber, notes: notes, dateAndTime: dates, statusUpdated: dates)
        
    

IZPARCEL 单元格


import UIKit

class IzparcelCell: UITableViewCell 

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var addressLabel: UILabel!
    @IBOutlet weak var trackingNumLabel: 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
       

[]

【问题讨论】:

你在 saveButton() 函数中声明了 prepare(segue..):它永远不会被调用。 "无法在我的 tableView 中显示自定义单元格文件" -- 你的意思是它从不 显示吗?或者你的意思是你一开始看到了单元格,但是当你从另一个控制器返回时它们没有显示? @DonMag 自定义单元格根本不显示 @izzziz - 在您显示的代码中,您声明 var IzParcelz = [IzParcel]() - 这是一个 empty 数组...但您从未向该数组添加任何数据。因此,您没有要显示的单元格。 @izzziz - 好的.. 你的prepareForUnwind 正在执行吗?如果是这样,设置一个断点并单步执行,检查对象。数据有效吗? 【参考方案1】:

我所有的代码都是正确的,除了代码的顺序。在审查并重新分配 saveButton Action 内部的 prepare for segue 声明到其外部之后。我能够将 InputScreen 中的数据传递到主屏幕上 TableView 中的自定义 TableView 单元格。

【讨论】:

以上是关于无法在我的 TableView 中显示自定义单元格文件?的主要内容,如果未能解决你的问题,请参考以下文章

重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)

无法使用 .xib 文件在我的自定义单元格中添加任何内容?

从 Tableview 自定义单元格翻转过渡到 UIViewController

如何在一个 tableView 中使用两个不同的自定义单元格?使用情节提要,iOS 7

使用调用自定义 tableview 单元格的函数简化 tableview 代码

无法显示跨到另一个 tableview 的 Tableview 和自定义表格单元格