【问题标题】:xib with UICollectionView - not key value coding compliant带有 UICollectionView 的 xib - 不符合键值编码
【发布时间】:2018-04-21 09:16:31
【问题描述】:

我有一个带有 XIB 的自定义 UIView。这个自定义UIView 有一个UICollectionView,它连接到一个IBOutlet。在视图设置中,UICollectionView 已正确初始化且不为零。

但是在cellForItemAtIndexPath 方法中,我得到了这个错误:-

由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类与键 selectorCollectionView 的键值编码不兼容。”

如果我删除数据源和委托,我不会收到任何错误。如果我添加它们,我会在这一行出现错误:-

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

请帮忙!

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

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

【问题讨论】:

    标签: ios swift uiview uicollectionview xib


    【解决方案1】:

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

    1. 尝试将插座剪松并重新连接。

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

    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 - 自定义类UITableViewCellSelectorTableViewCell 并将SelectorView 内部contentView 连接到'SelectorTableViewCell' 的出口。

    我想就是这样。 Here是项目:

    【讨论】:

    • 感谢丹尼尔的回复,我尝试了几次,甚至退出了​​ Xcode,删除了派生数据和所有的废话。我正在用我的截图编辑问题
    • 挑战 :-) 也许您在未正确连接的 xib 文件中引用了 UIView 的子类。当您的 xib 引用错误的类时,就会发生这种情况。如果您尚未删除引用的 .swift 和 .xib 文件 - 我建议您删除并重新添加它们。也许也可以删除标识符和类 (2,3) 并重新声明它们。
    • 谢谢丹尼尔,我会试试的。我还在我的问题中上传了该项目。如果你能看看会很棒:)
    • @RajeevBhatia,我用解决方案编辑了我的答案。让我知道它是否适合您。
    • @RajeevBhatia - 您的项目附在我的回答末尾。您的问题已解决。请接受答案。
    【解决方案2】:

    在我们的例子中,问题是在 Storyboard 中建立了错误的连接。单击 Storyboard 中的自定义类——不是文件所有者——然后将 IB 插座连接到自定义类中的变量。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您可以尝试以下方法:

        1. 点击YourCell.xib左侧面板上的文件所有者。然后进入Attributes inspector 并检查Class 字段中是否指定了任何类。如果没有 - 我在这里没有帮助。如果是 - 删除它并点击 Enter

        2. YourCell.xib中依次点击所有子视图并删除Connections Inspector中的所有出口。无需在YourCell.swift中删除。

        3. 一旦您的单元的文件所有者和插座被移除,我们就可以重新连接插座。只需像往常一样将每一个拖到 YourCell.swift 中现有的相应 IBOutlet 即可。

        结果,当您点击YourCell.xib左侧面板中的YourCell并转到Connections Inspector时,您会看到所有插座都已连接.像这样:

        如果您在 YourCell 中检查特定视图的连接,您应该会看到它的插座已连接到 YourCell(我的 StaticSlot案例)。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-03-17
          • 2016-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-15
          相关资源
          最近更新 更多