使用带有UICollectionView的xib文件 - 不符合键值编码规范

5
我有一个包含XIB文件的自定义UIView。该自定义UIView具有一个UICollectionView,并已连接到一个IBOutlet。在视图设置中,UICollectionView已正确初始化且不为nil。

然而,在cellForItemAtIndexPath方法中,我得到了以下错误:

Terminating app due to uncaught exception 'NSUnknownKeyException',reason:'[ setValue:forUndefinedKey:]:此类不符合键值编码选择器CollectionView的要求。'

如果我删除数据源和代理,我就不会收到任何错误。如果我添加它们,则会在此行收到错误:

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

请帮忙!

编辑:我已经附上了我的设置截图

将自定义视图添加到UITableViewCell

自定义视图具有此集合视图

我已为单元格设置类别

和标识符

我也在这里上传了项目http://www.fast-files.com/getfile.aspx?file=148623

4个回答

5

可能是同步问题,有时会发生:

  1. 尝试切断插座并重新连接它们。

  2. 确保 Collection Reusable View 标识符在 xib 文件中定义:

    在这里设置标识符
  3. 确保集合视图单元格的自定义类在 xib 文件中定义:

在这里设置自定义类

编辑: 我深入研究了您的项目,以下是我的发现:

UICollectionView 应该在 awakeFromNib 方法中初始化(重写它):

override func awakeFromNib() {
    super.awakeFromNib()
    let cellNib = UINib(nibName: String(describing: "SelectorCell"), bundle: nil)
    selectorCollectionView.register(cellNib, forCellWithReuseIdentifier: "selectorCell")
    selectorCollectionView.dataSource = self
    selectorCollectionView.delegate = self
}
loadViewFromNib应该长这样(移除集合视图init'):
func loadViewFromNib() -> UIView {
    let nib = UINib(nibName: "SelectorView", bundle: nil)
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
    return view
}

同样地,子类化 SelectorTableViewCell。

class SelectorTableViewCell: UITableViewCell {
    @IBOutlet weak var selectorView: SelectorView!
}

Main.storyboard中,将自定义类UITableViewCell更改为SelectorTableViewCell,并将contentView内的SelectorView连接到'SelectorTableViewCell'的输出。就这样了。项目在这里

谢谢你的回复,Daniel。我尝试了好几次,甚至退出了Xcode,删除了派生数据和所有那些废话。我正在使用我的截图编辑问题。 - Rajeev Bhatia
也许您在xib文件中引用了UIView的子类,但连接不正确。这种情况通常是由于xib引用了错误的类所致。 如果您没有删除引用的.swift和.xib文件,我建议您这样做并重新添加它们。另外,您可以尝试删除标识符和类(2,3),然后重新定义它们。 - DanielH
谢谢Daniel,我会尝试。我也在我的问题中上传了项目。如果您能看一下的话,那将很棒 :) - Rajeev Bhatia
@RajeevBhatia,我编辑了我的答案并提供了一个解决方案。如果它对你有用,请告诉我。 - DanielH
@RajeevBhatia - 你的项目已经附在我的回答末尾。你的问题已经解决,请接受这个答案。 - DanielH
说句实话,我没有注意到“从目标继承模块”没有启用,这解决了我的问题。也许值得再检查一下。 - Antlip Dev

1
你可以尝试以下操作:
  1. YourCell.xib 的左侧面板上点击 File Owner。然后进入 Attributes inspector,查看Class字段中是否指定了任何类。如果没有,则无法提供帮助。如果有,则删除它并按 Enter

  2. YourCell.xib 中依次单击所有子视图,并在 Connections Inspector 中删除所有的输出口。不需要在 YourCell.swift 中删除它们。

  3. 一旦您的单元格的 File Owner 和输出口被删除,我们就可以重新连接输出口。只需像往常一样将每个输出口拖动到 YourCell.swift 中相应的 IBOutlet 上即可。

结果,当您在 YourCell.xib 的左侧面板上单击 YourCell 并进入 Connections Inspector 时,您将看到所有输出口都已连接。如下所示:

enter image description here

如果您在YourCell中检查特定视图的连接,则应该看到它的输出口连接到YourCell(在我这里是StaticSlot)。

enter image description here

这对我很有帮助,希望你也能得到同样的帮助。


0
在我们的情况下,问题是在Storyboard中进行了错误的连接。点击Storyboard中的自定义类 - 而不是文件所有者 - 然后将IB输出连接到自定义类中的变量。

0

如果尝试注册您的自定义类和单元格ID

self.collectionView.register(nib, forCellWithReuseIdentifier: "Cell")
self.collectionView.register(CustomClassCell.self, forCellWithReuseIdentifier: "Cell")

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