自定义 tableview 单元 xib 出口返回 nil

Posted

技术标签:

【中文标题】自定义 tableview 单元 xib 出口返回 nil【英文标题】:custom tableview cell xib outlets returning nil 【发布时间】:2020-07-08 08:40:35 【问题描述】:

我有一个带有 tableview 的视图控制器。我想用我用 xib 文件以编程方式创建的自定义 uitableviewcell 注册我的 tableview。在自定义单元格内,我有一个可以更改网点标签值的函数,这就是我遇到致命发现 nil 错误的地方。这是我的视图控制器代码。

    class AllTasksViewController: UIViewController
    
    var tableView = UITableView()
    
    func configureTableView()
        view.addSubview(tableView)
        setTableViewDelegates()
        tableView.rowHeight = 50
        tableView.translatesAutoresizingMaskIntoConstraints = false
        tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
        tableView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
        tableView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        tableView.register(CustomCellNSB2.self, forCellReuseIdentifier: "CustomCellNSB2")
    
    func setTableViewDelegates()
        tableView.delegate = self
        tableView.dataSource = self
    
    
    

    

        override func viewDidLoad()
            super.viewDidLoad()
            
            configureTableView()
            print("allTasksView loaded")
                        //add some positioning and size constraints here for allTasksView
        
    

extension AllTasksViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return allTasks.count
    
    
    
    // Cell Data and Configuration
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let task = allTasks[indexPath.row] // creating a new task from the already stored task depending on the indexpath.row if indexPath.row is 3 then the task is tasks[3]
                let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCellNSB2", for: indexPath) as! CustomCellNSB2 // setting the identifier ( we have already set in the storyboard, the class of our cells to be our custom cell)
                        cell.setTask(task: task) `// this is where my app is crashing`
                        if (task.value(forKey: "isComplete") as! Bool == true)
                        cell.labelsToWhite()
                        cell.backgroundColor = Colors.greencomplete
                        cell.selectionStyle = .none
                    
                     else 
                        cell.backgroundColor = .white //adjust for nightmode later
                        cell.labelsToBlack()
                
                

                
                
                print("CellData Task :", task.value(forKey: "isComplete") as! Bool, task.value(forKey: "name") as! String)
                

        //        if !(task.value(forKey: "isComplete") as! Bool)
        //            cell.backgroundColor = task.isImportant ? .purple : .white //according to the task isImportant attribute we set the background color
        //        
                
                return cell
        
    

这是我的自定义 uitableview 单元格

import UIKit
import CoreData
class CustomCellNSB2: UITableViewCell 
    @IBOutlet weak var taskLabel: UILabel!
    @IBOutlet weak var dateLabel: 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
    
    
    func setTask(task: NSManagedObject ) debugger leads me here. this is where it's getting nil
        taskLabel.text = task.value(forKey: "name") as? String
        dateLabel.text = task.value(forKey: "date") as?
        String

    

    func labelsToWhite() 
        taskLabel.textColor = .white
        dateLabel.textColor = .white
    

    func labelsToBlack() 
        taskLabel.textColor = .black
        dateLabel.textColor = .red
    

    

【问题讨论】:

你没有在cellForRowAt方法中加载xib文件。 1st,在调用 setTask 之前确保这个任务已经包含有效数据,2nd 确保 taskLabel 和 dateLabel 连接到你的 xib 【参考方案1】:

您必须注册您的NIB ...您所做的就是注册课程。

改变这个:

tableView.register(CustomCellNSB2.self, forCellReuseIdentifier: "CustomCellNSB2")

到这里:

tableView.register(UINib(nibName: "CustomCellNSB2", bundle: nil), forCellReuseIdentifier: "CustomCellNSB2")

如果您正确配置了 xib/nib,那么您可能只需要这样做。

【讨论】:

是的,我刚刚测试了他的代码,我打算发布相同的:)

以上是关于自定义 tableview 单元 xib 出口返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

错误:在 swift 中使用 xib 文件注册自定义 tableView 单元格

单击tableView后隐藏xib的自定义UITableViewCell

将多个自定义 TableViewCell Xib 索引到 TableView

如何创建从集合单元 xib 文件到集合视图控制器的出口

如何链接两个xib?

动态调整自定义 xib 单元格的大小