UICollectionViewController 在升级的 XCode 7 项目中不起作用

Posted

技术标签:

【中文标题】UICollectionViewController 在升级的 XCode 7 项目中不起作用【英文标题】:UICollectionViewController not working in upgraded XCode 7 project 【发布时间】:2016-03-14 11:04:32 【问题描述】:

我正在开发一个使用故事板的项目,该项目从 XCode 6 开始并已升级到 XCode 7。我正在尝试添加 UICollectionViewController。我在这条线上遇到了一个例外:let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UnsplashCollectionViewCell

我已验证控制器和单元格都分配给了我在情节提要中的自定义类,并且我的重用标识符已分配给单元格,并且与我的控制器类中的变量重用标识符相同。

关于工作的 UICollectionViewController 和这个项目的唯一区别是,如果我开始一个新项目并添加一个 UICollectionViewController,我会在 Connections Inspector 中得到以下信息:

但是,我损坏的项目中的 Connections Inspector 看起来像:

我不确定这是不是问题,但我不知道还有什么问题。

崩溃日志:

未捕获的异常:无法将类型视图出列:带有标识符 UnsplashCell 的 UICollectionElementKindCell - 必须为标识符注册一个 nib 或一个类,或连接情节提要中的原型单元

完整的崩溃日志:

2016-03-14 10:34:55.027 PixelSquidTouch[86881:2845927] [Crashlytics] 版本 3.4.1 (92) 2016-03-14 10:34:55.063 PixelSquidTouch[86881:] App 测量 v.1201000 开始 2016-03-14 10:35:02.990 PixelSquidTouch[86881:2845927] *** 断言失败 -[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/ UIKit_Sim/UIKit-3512.30.14/UICollectionView.m:3690 -必须为标识符注册一个 nib 或一个类,或者在情节提要中连接一个原型单元 2016-03-14 10:35:08.054 PixelSquidTouch[86881:2845927] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法使同类视图出列:带有标识符 UnsplashCell 的 UICollectionElementKindCell - 必须注册一个 nib 或标识符的类或连接情节提要中的原型单元' *** 首先抛出调用堆栈: ( 0 核心基础 0x000000010c95ce65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010ffb0deb objc_exception_throw + 48 2 CoreFoundation 0x000000010c95ccca +[NSException raise:format:arguments:] + 106 3 基础 0x000000010fa274de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 4 UIKit 0x000000010ddd04e9-[UICollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:] + 2009 5 UIKit 0x000000010ddd0945-[UICollectionView dequeueReusableCellWithReuseIdentifier:forIndexPath:] + 169 6 PixelSquidTouch 0x000000010b8d9e6a _TFC15PixelSquidTouch32UnsplashCollectionViewController14collectionViewfS0_FTCSo16UICollectionView22cellForItemAtIndexPathCSo11NSIndexPath_CSo20UICollectionViewCell + 122 7 PixelSquidTouch 0x000000010b8d9f8f _TToFC15PixelSquidTouch32UnsplashCollectionViewController14collectionViewfS0_FTCSo16UICollectionView22cellForItemAtIndexPathCSo11NSIndexPath_CSo20UICollectionViewCell + 79 8 UIKit 0x000000010ddc05ba-[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:isFocused:] + 483 9 UIKit 0x000000010ddc2ae0-[UICollectionView _updateVisibleCellsNow:] + 4431 10 UIKit 0x000000010ddc723b-[UICollectionView layoutSubviews] + 247 11 UIKit 0x000000010d6224a3-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703 12 QuartzCore 0x000000010f41759a -[CALayer layoutSublayers] + 146 13 石英核心 0x000000010f40be70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 14 石英核心 0x000000010f40bcee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 15 石英核心 0x000000010f400475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 16 石英核心 0x000000010f42dc0a _ZN2CA11Transaction6commitEv + 486 17 UIKit 0x000000010d596b47 _afterCACommitHandler + 174 18 核心基础 0x000000010c888367 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 19 核心基础 0x000000010c8882d7 __CFRunLoopDoObservers + 391 20 核心基础 0x000000010c87df2b __CFRunLoopRun + 1147 21 核心基础 0x000000010c87d828 CFRunLoopRunSpecific + 488 22 图形服务 0x000000011197cad2 GSEventRunModal + 161 23 UIKit 0x000000010d56b610 UIApplicationMain + 171 24 PixelSquidTouch 0x000000010b957aad 主 + 109 25 libdyld.dylib 0x0000000110b5692d 开始 + 1 26 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止

【问题讨论】:

发布崩溃日志或异常 崩溃日志对我来说似乎很简单......这里的真正问题是什么? 【参考方案1】:

因此,您正试图将一个单元格出列,但没有具有该 ID 的单元格。您需要在情节提要或 Xib 中打开单元格并将 UICollectionElementKindCell ID 设置为该 ID UnsplashCell

如果您还没有将情节提要中的单元格作为原型单元格,而是使用 xib 文件,那么您还需要将该单元格注册到 tableview,以便它知道单元格类型。

在你看来DidLoad:

let nibName = UINib(nibName: "UICollectionElementKindCell", bundle:nil)
self.tableView.registerNib(nibName, forCellReuseIdentifier: "UnsplashCell")

更新:

在选择了 VC 的情况下查看情节提要中的对象出口等。

【讨论】:

感谢您的回答,我正在故事板上执行此操作,并将 Collection Reusable View Identifier 设置为与我在 dequeue 调用中使用的重用标识符相同的字符串 - 我假设这和 UICollectionElementKindCell ID 是一样的吗?如果没有,你能告诉我在哪里可以找到该房产吗? 很遗憾,肯定是其他问题。我已经检查了好几次 ID 是一样的。我仍然认为这一定与故事板从 XCode 6 到 XCode 7 的转换有关。 您可以发布您的故事板吗?或细胞检查员的屏幕截图。我怀疑它也可能是已经改变的类型。自定义单元格的类类型是否正确? 感谢您花时间在这方面。我不能分享故事板,但我有一些细胞检查员的截图。如果我开始一个全新的项目并设置它的类和重用标识符,它在这个项目中不起作用。 嗯,看起来它正在尝试加载 UICollectionElementKindCell,而不是正确的单元格类型。你能粘贴填充崩溃日志吗?您还可以将情节提要作为代码打开并在其中查找 UICollectionElementKindCell。【参考方案2】:

自从上周升级到 XCode 7 后,我也在努力解决同样的问题。在我们的例子中,每当我们显示活动视图时,我们都会禁用用户交互:

[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

然后,在回调块中,我们重新启用了用户交互:

[[UIApplication sharedApplication] endIgnoringInteractionEvents];

删除这些调用解决了我们代码中四分之三的问题;希望它也可以解决您的问题。无论如何,我们还没有想出更好的方法。

【讨论】:

谢谢。我们没有打这些电话,所以这似乎不是同一个问题。希望我们都能尽快找到解决方案!

以上是关于UICollectionViewController 在升级的 XCode 7 项目中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UISearchController 像 Instagram 探索选项卡

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小