如何在UITableViewController中使用自定义单元格时阻止获取nil接口元素?

时间:2018-01-25 18:24:24

标签: ios swift uitableview swift4

本网站上有很多问题,其他问题解决了让Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value尝试在自定义表格视图单元格中设置界面元素的问题。

如何在设置界面元素时阻止界面元素为空?

我完成了我的作业并查看了这些相关问题的答案。

  • 我已经确定我没有在viewDidLoad中注册该类,因为我正在使用UITableViewController。

  • 在Main.storyboard文件中正确引用了UITableViewController。

  • UITableViewController中的单元格被赋予了正确的reuseIdentifier和类。

  • 我对tableView的dequeueReusableCell调用具有正确的标识符,与故事板中的标识符匹配。

  • 我打破了笔尖的出口并重新连接了它们。

我正在设置一个UITableViewController,“FindTableViewController。”

class FindTableViewController: UITableViewController {

    var services = Fetch().getServices()

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    /*Sections & rows defined here*/
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Monk", for:indexPath) as! Monk
        let service = services[indexPath.row]
        cell.set(service)
        return cell
    }
}

在另一个文件中,我定义了自定义单元格Monk。

import UIKit

class Monk: UITableViewCell {

    @IBOutlet weak var titleImage: UIImageView!
    //other outlets defined here

    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 set(_ service:Service) {
        if let imgv = self.titleImage  {
            imgv.image = service.image
        } else {
            print(self.titleImage)
        }
        self.titleLabel.text = service.title
        /*other elements set here*/
    }
}

我有一种感觉,我确实做了一些事情,真的愚蠢。

我已将自定义类名设置为Monk,并将单元标识符设置为Monk,因为我不希望这种混淆成为问题的根源,并且使名称不同并不能解决问题。< / p>

enter image description here

enter image description here

我甚至在Service对象中打印了它们,它们与预期的匹配。

if let imgv = self.titleImage  {
            imgv.image = service.image
        } else {
            print(self.titleImage)
        }

打印“nil”并在下一行抛出错误

self.titleLabel.text = service.title

我还将nib的标识符和类设置为“Monk”。

1 个答案:

答案 0 :(得分:1)

这很简单。

如果您正在为您的手机使用自定义NIB,那么您需要注册它。

viewDidLoad中的类似内容:

let myNib = UINib(nibName: "MonkCell", bundle: nil)
tableView.register(myNib, forCellReuseIdentifier: "Monk")

如果您选择直接在视图控制器的故事板中布置单元格,则不需要这样做。