Swift中的简单UITableView - 意外地发现没有

时间:2014-07-18 20:36:21

标签: ios uitableview swift

非常简单的代码:

func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
    return 1
}

func tableView(tableView:UITableView!, numberOfRowsInSection section:Int) -> Int {
    return 5
}


func tableView(tableView:UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
    let cell: BookTableViewCell = BookTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "BookCell")
    println("ip: \(indexPath.row)")
    cell.bookLabel.text = "test"

    return cell
}

在cell.bookLabel.text行上我得到了这个:

fatal error: unexpectedly found nil while unwrapping an Optional value

BookTableViewCell的定义如下:

class BookTableViewCell: UITableViewCell {

    @IBOutlet var bookLabel: 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
    }

}

bookLabel正确地连接在Storyboard的Prototype单元格中。为什么我收到此错误?

13 个答案:

答案 0 :(得分:74)

如果您正在使用情节提要,请确保在文件开头没有此行:

self.tableView.registerClass(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")

它将覆盖故事板,因此,故事板中的出口链接将被忽略。

答案 1 :(得分:19)

我收到此错误是因为我没有在自定义单元格的故事板中写入标识符。

StoryBoard

还要确保它与您的代码匹配:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {

        let cell = tableView.dequeueReusableCellWithIdentifier("CustomTableCell") as CustomTableCell

        ...
    }

答案 2 :(得分:7)

在代码中创建视图时,其IBOutlet属性无法正常连接。您需要从dequeueReusableCellWithIdentifier获取的版本:

let cell = tableView.dequeueReusableCellWithIdentifier("BookCell") as BookTableViewCell

答案 3 :(得分:7)

可能是你在Main.Storyboard中的视图在ViewController文件中丢失了它的IBOutlet引用,只是再次链接它。

答案 4 :(得分:3)

不要忘记注册nib(使用Swift3测试),e。 G。在中覆盖func viewDidLoad()

self.tableView.register(UINib(nibName: "BookTableViewCell", bundle: nil), forCellReuseIdentifier: "BookCell")

答案 5 :(得分:2)

之所以问这个问题很多,是因为它取决于您如何设置表格视图和自定义CellClass。您是在情节提要中还是以编程方式创建表视图?您是否创建自定义.xib单元和自定义单元类?

如果您通过编程方式创建了表格视图并创建了自定义.xib和Cell类,那么这就是 Swift 4 的答案:

in viewDidLoad:

        customTable.register(UINib(nibName: "NibName", bundle: nil), forCellReuseIdentifier: "NibNameIdentifier")

in cellforRowat:
        let cell = tableView.dequeueReusableCell(withIdentifier: "NibName") as! ClassName

注意:请确保在单元.xib文件中,您在“属性”检查器(“ NibNameIdentifier”)中设置了标识符。

答案 6 :(得分:1)

在我的情况下,这是可拆包的方式:

let cellId:String = "ConverterTableCell"
let cell: ConverterTableViewCell = (tableView.dequeueReusableCellWithIdentifier(cellId)! as? ConverterTableViewCell)!

答案 7 :(得分:1)

迅速5 在同一情节提要中,两个类分别是A类和B类,B类包含tableview出口,当我尝试将A类推到B类时,它崩溃了,并显示tableView出口nil。

在A类中,我像下面的代码一样进行导航。

let classBObj = ClassB()
self.navigationController?.pushViewController(classBObj, animated: true)

然后我意识到自己的错误,并在下面的代码中使用了它,它工作正常。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let classBObj = storyboard.instantiateViewController(withIdentifier: "ClassB") as! ClassB
self.navigationController?.pushViewController(classBObj, animated: true)

答案 8 :(得分:0)

尝试这样做:

let cell = tableView.dequeueReusableCellWithIdentifier("BookCell", forIndexPath: indexPath) as! BookTableViewCell

并且不要忘记在故事板中设置重用标识符

答案 9 :(得分:0)

每当我使用重新使用Identifer 名称而不是自定义类名称时,我都会收到此错误 unifid这些名字为我解决了

答案 10 :(得分:0)

如果我把UITapGestureRecognizer放在故事板上的自定义UITableViewCell中,我会遇到这个错误。(Xcode版本是8.3)。

答案 11 :(得分:0)

在Swift 5中

首先,我尝试使用下面提到的类和标识符将UITableViewCell注册到viewdidload()中,但这对我不起作用。

self.tableView.registerClass(MyCustomTableViewCell.self, forCellReuseIdentifier: "customCell")

解决方案

Then I registered my UITableViewCell using Nib name and it worked for me

使用笔尖名称在viewdidload()中注册单元格

override func viewDidLoad() 
{
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //register your table view cell in Viewdidload() using Nib Name       
    tableView.register(UINib.init(nibName: "MyCustomTableViewCell", bundle: nil), forCellReuseIdentifier: "customCell")
}

答案 12 :(得分:0)

您需要检查两件事

1。在viewDidLoad中用笔尖名称注册单元格


func viewDidLoad() 
{
    super.viewDidLoad()
    listTableView.register(UINib.init(nibName: "ListProductCell", bundle: nil), forCellReuseIdentifier: "ListProductCell")
 }

2。以这种方式创建自定义单元格。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ListProductCell") as! ListProductCell
        return cell
    }