无法在我的 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)
从 Tableview 自定义单元格翻转过渡到 UIViewController
如何在一个 tableView 中使用两个不同的自定义单元格?使用情节提要,iOS 7