大佬教程收集整理的这篇文章主要介绍了ios – 使用带有FlowLayout的UICollectionView的单元格滚动UITableView时,应用程序崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UITableView,其单元格具有UICollectionView和水平FlowLayout.当我快速上下滚动桌面视图并且不让它停在设备(iPad Air 2,iOS 9.3.2)或模拟器上时,应用程序崩溃了
EXC_BAD_ACCESS
在AppDelegate中.
该应用程序没有在视图控制器中为didReceiveMemoryWarning()设置断点.
似乎代码崩溃了
[UICollectionViewData invalidateItemsATindexPaths:]
要么
[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidaTing:]
其次是
0_dispatch_barrier_async_f_slow.
堆栈跟踪不会指向任何应用程序代码行.
模拟器的控制台堆栈跟踪(在设备上崩溃时没有控制台堆栈跟踪):
*** TerminaTing app due to uncaught exception 'NSInvalidArgumentexception',reason: '+[_UIFlowLayoutItem frame]: unrecognized SELEctor sent to class 0x110f9ecc0' *** First throw call stack: ( 0 CoreFoundation 0x000000011259cd85 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x00000001137d3deb objc_exception_throw + 48 2 CoreFoundation 0x00000001125a5c3d +[NSObject(NSObject) doesnotRecognizeSELEctor:] + 205 3 CoreFoundation 0x00000001124ebcfa ___forWARDing___ + 970 4 CoreFoundation 0x000000011259e1f8 __forWARDing_prep_1___ + 120 5 UIKit 0x0000000110b1d8b5 -[UICollectionViewData invalidateItemsATindexPaths:] + 273 6 UIKit 0x0000000110ae26b7 -[UICollectionView _invalidateWithBlock:] + 62 7 UIKit 0x0000000110ae2a6f -[UICollectionView _invalidateLayoutWithContext:] + 656 8 UIKit 0x0000000110af0ad9 -[UICollectionViewLayout invalidateLayoutWithContext:] + 189 9 UIKit 0x0000000110afe2cc -[UICollectionViewFlowLayout invalidateLayoutWithContext:] + 604 10 libdispatch.dylib 0x0000000114257d9d _dispatch_call_block_and_release + 12 11 libdispatch.dylib 0x00000001142783eb _dispatch_client_callout + 8 12 libdispatch.dylib 0x00000001142601ef _dispatch_main_queue_callBACk_4CF + 1738 13 CoreFoundation 0x00000001124f60f9 __CFRUNLOOP_IS_serviCING_THE_MAIN_DISPATCH_QUEUE__ + 9 14 CoreFoundation 0x00000001124b7b99 __CFRunLoopRun + 2073 15 CoreFoundation 0x00000001124b70f8 CFRunLoopRunSpecific + 488 16 Graphicsservices 0x0000000114bcaad2 GSEventRunModal + 161 17 UIKit 0x000000011024cf09 UIApplicationMain + 171 18 market-touch 0x000000010d4cc472 main + 114 19 libdyld.dylib 0x00000001142ac92d start + 1 20 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminaTing with uncaught exception of type NSException
这是stack trace(略有不同的版本here).
为什么会发生这种情况,我能做些什么来防止这种情况发生?
编辑:
根据@L_301_4@的请求,这是我的cellForRowATindexPath:
func tableView(tableView: UITableView,cellForRowATindexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier(cus@R_801_10608@ellNibName,forIndexPath: indexPath) as! CustomTableViewCell //populaTing cell with data return cell }
我根本不调用func setCollectionViewLayout(_ layout:UICollectionViewLayout,animated animated:Bool).
流程布局设置在IB中完成.
如果有的话,启用僵尸对象对我没什么帮助.这是我得到的堆栈跟踪:
-[NSIndexPath frame]: unrecognized SELEctor sent to instance 0xc000000012de4890 *** TerminaTing app due to uncaught exception 'NSInvalidArgumentexception',reason: '-[NSIndexPath frame]: unrecognized SELEctor sent to instance 0xc000000012de4890' *** First throw call stack: (0x1815f6db0 0x180c5bf80 0x1815fdc4c 0x1815fabec 0x1814f8c5c 0x186fcccc0 0x186f9e688 0x1868de558 0x1868da0a4 0x1869ae9ec 0x1024f9a7c 0x1024f9a3c 0x1024ff4e4 0x1815acd50 0x1815aabb8 0x1814d4c50 0x182dbc088 0x1867b6088 0x1000c9f58 0x1810728b8) libc++abi.dylib: terminaTing with uncaught exception of type NSException
编辑2:
在我的CustomTableViewCell的awakeFromNib()方法中,我有以下代码:
if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { layout.estimatedItemSize = CGSizeMake(50,22) }
我注意到,如果我发表评论,我就不会再遇到崩溃(尽管有时整个表视图会冻结并且无法使用).但是,集合视图单元格的大小不正确.比较:right对比wrong.
在IB中,集合视图流程布局 – >物品尺寸为50×22.用于集合视图的单元格中有一个按钮,高度约束为22pt.以下是为集合视图单元格设置布局属性的方法:
override func preferredLayoutAttributesFitTingAttributes(layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes { let attributes = super.preferredLayoutAttributesFitTingAttributes(layoutAttributes) button.settitle(symbol,forState: .Normal) button.sizeToFit() attributes.frame = button.frame return attributes }
我们的想法是让这些细胞高22pt,宽度不同(约50pt),它们之间的距离相同.我可以在不调用代码的情况下实现这一点,当注释掉时,可以防止崩溃吗?
基本上,这可能是因为UITableViewCell的可重用必要条件.滚动tableView时,它使用相同的可见单元格集,并从您的cellForRowATindexPath:方法设置内容.
根据您的实现,似乎在特定时间点取消分配UICollectionViewFlowLayout.我的意思是,你有电话
func setCollectionViewLayout(_ layout: UICollectionViewLayout,animated animated: Bool)
在cellForRowATindexPath中:在滚动时,新的UICollectionViewLayout被分配并设置为单元格内的collectionView.在编辑方案中启用Zombie对象 – >诊断 – >启用Zombie Objects.检查当前状态的正确性.
很难建议任何工作片段,但作为一个想法,尝试在uitableviewCell的init方法中设置与流布局相关的所有属性(仅一次),这将避免重新分配:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowATindexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"CellIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reusEIDentifier:CellIdentifier]; // set your flow layout or other stuff here } return cell; }
希望这可以帮助.
以上是大佬教程为你收集整理的ios – 使用带有FlowLayout的UICollectionView的单元格滚动UITableView时,应用程序崩溃全部内容,希望文章能够帮你解决ios – 使用带有FlowLayout的UICollectionView的单元格滚动UITableView时,应用程序崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。