Swift - 无法在我的tableView上使用"registerNib"来添加自定义单元格

9

我正在学习如何在Swift中向tableView添加自定义单元格。我看了很多教程,它们都在某个地方说要使用类似于tableView.registerNib的东西,但这对我不起作用!

这是我在tableViewController类中使用的代码:

var nib = UINib(nibName: "ViewExerciceCell", bundle: nil)
tableView.registerNib(nib, forCellReuseIdentifier: "ExerciceCell")

当我尝试构建时,第二行出现错误,错误信息如下:

无法使用类型为 '(UINib, forCellReuseIdentifier: String)' 的参数列表调用 'registerNib'。

我该怎么办?所有关于自定义单元格的教程和其他答案都使用此代码。

谢谢您提前的帮助。


tableView 是如何声明的?请注意,如果 tableView 是一个可选项,你不能直接调用方法,必须使用 tableView?.registerNib 表示法。 - Sulthan
我的tableView被声明为Outlet:@IBOutlet weak var tableView: UITableView! - Nicolas Meienberger
你的代码没有问题。我能想到的唯一问题是你可能有一个拼写错误,并且你没有正确地复制这个错误。 - Sulthan
你是如何创建这个单元格的?使用代码还是 nib 文件? - Amit89
有没有办法重现你的问题? - Vivek Molkar
6个回答

5
我在tableView:cellForRowAtIndexPath函数中使用以下代码:

// 这里是你的代码

var cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as UITableViewCell
if cell == nil {
    tableView.registerNib(UINib(nibName: "CustomCell", bundle: nil), forCellReuseIdentifier: "CustomCell")
    cell = tableView.dequeueReusableCellWithIdentifier("CustomCell") as UITableViewCell!
}

return cell

如果您在storyboard或.xib文件中有自定义单元格,请不要忘记在属性检查器中设置标识符(在这种情况下为CustomCell)


3
重复注册 Nib 看起来很浪费。在加载时只需注册一次即可。 - drew..
我支持@drew的评论。注册单元格只需要一次,因此不需要在cellForRowAtIndexPath:方法中编写。 - N a y y a r

3

在一番思考之后,我意识到了我的错误:

我应该使用"forCellWithReuseIdentifier"而不是"forCellReuseIdentifier"。随着Swift的变化如此之快,很难跟上所有的变化。希望这可以帮到你们。

对我有效的解决方案是:

self.collectionView!.register(UINib(nibName: "CategoryCVCell", bundle: nil), forCellWithReuseIdentifier: "CategoryCVCell")

很有趣。当我尝试使用“forCellWithReuseIdentifier”时,出现了错误,不得不改回“forCellReuseIdentifier”,但两者都没有解决问题。 - Bruce Patin

2

好的...我不知道问题出在哪里,但是在我的项目中删除cell.xib文件的引用,然后再次添加它就解决了问题。我过去已经解决了一些类似的问题。

谢谢大家的快速回答!


1
我使用了一个通用函数,我像这样调用它。
tableView.register(UINib(nibName: R.reuseIdentifier.uploadDocHeaderCell.identifier, bundle:nil), forCellReuseIdentifier: R.reuseIdentifier.uploadDocHeaderCell.identifier)

这个通用类是从Github上使用的,但您可以直接使用以下函数:

public func register<Resource: NibResourceType & ReuseIdentifierType>(_ nibResource: Resource)
    where Resource.ReusableType: UICollectionViewCell
  {
    register(UINib(resource: nibResource), forCellWithReuseIdentifier: nibResource.identifier)
  }

GitHub资源的链接为:

参考附带的链接


1
在我的情况下,解决方案是更改以下内容:

collectionView.register(MovieCollectionViewCell.self, forCellWithReuseIdentifier: "moviesCollectionView")

To this:

collectionView.register(UINib(nibName: "MovieCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "moviesCollectionView")

0
在你的viewDidLoad方法中添加以下代码行:
let nibName = UINib(nibName: "cell_name", bundle:nil)
        collectionView.register(nibName, forCellWithReuseIdentifier: "cell_name")

然后在你的cellForItemAt方法中,添加以下几行代码:

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell_name", for: indexPath)as! cell_name

一定要将标识符赋值给单元格。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接