UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败

Posted

技术标签:

【中文标题】UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败【英文标题】:UICollectionView, nib from a framework target registered as a cell fails at runtime 【发布时间】:2014-08-05 12:35:48 【问题描述】:

我在 xib 中绘制了一个 UICollectionViewCell,并附有 swift 类文件。这两个文件是我应用的 UI 框架目标(称为 SomeUI)的一部分。

在我的集合视图的视图控制器中(在应用程序目标中),我将 nib 注册为集合视图单元格。我的视图控制器代码如下;

import UIKit
import SomeUI

let reuseIdentifier = "Cell"

class ACollectionViewController: UICollectionViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        self.collectionView.registerNib(UINib(nibName: "JamesTheCollectionViewCell", bundle: NSBundle(identifier: "SomeUI")), forCellWithReuseIdentifier: reuseIdentifier)
    

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView!) -> Int 
        return 1
    

    override func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int 
        return 1
    

    override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! 
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as JamesTheCollectionViewCell
        cell.titleLabel.text = "yippee"
        return cell
    

在 nib 中,单元格视图的自定义类设置得当;模块 SomeUI 中的 JamesTheCollectionViewCell。

虽然 Xcode 似乎对这个设置很满意,但在运行时我收到一个错误,因为无法找到在 JamesTheCollectionView.swift 中定义的类。

未知类 _TtC19collectionViewThing26JamesTheCollectionViewCell 中 界面生成器文件。

如果我将 JamesTheCollectionView.swift 的目标成员从框架切换到应用程序(但将 xib 作为框架的一部分),一切运行正常。但是,我要求 xib 文件从框架中加载类……我缺少什么,为什么当单元实现类是框架的一部分时它不起作用?

作为参考,这里是单元实现文件:

import UIKit

public class JamesTheCollectionViewCell: UICollectionViewCell 
    @IBOutlet public weak var titleLabel: UILabel!

【问题讨论】:

【参考方案1】:

解决了。

TL:DR; 更改文件的目标成员身份时,请记住在下一次构建之前执行 Product > Clean!

说明: 问题是“SomeUI”不是有效的 UIBundle 标识符,因此 NSBundle(identifier: "SomeUI") 返回 nil,因此 registerNib 行从应用程序包而不是框架注册了一个 nib。应用程序包不包含单元实现类,因此它崩溃了。

但是……应用程序包也不应该包含笔尖?那么那里发生了什么?我一直在切换 nib 和实现文件的目标成员资格。我没有在构建之间运行“清理”,因此 nib 的副本留在了应用程序目标构建文件夹中。

原始问题的解决方案是通过将NSBundle(identifier: "SomeUI") 替换为NSBundle(forClass: JamesTheCollectionViewCell.self),从SomeUI 框架中正确加载笔尖

【讨论】:

以上是关于UICollectionView,来自注册为单元格的框架目标的 nib 在运行时失败的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 显示为空白 - 单元格不显示

UICollectionView:1 行水平滚动(从右到左),带有来自右侧的新单元格的自定义动画

在 UICollectionView 中注册多个单元格(swift 3)

触摸单元格时 UICollectionView 崩溃

如何在 iOS 中动态更改 UICollectionView 单元格高度

UICollectionView 不重用单元格