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)