pin*_*ngd 5 uitableview ios uicollectionview swift
该应用程序是使用 Xcode 7.3.1 以 Swift 2.2 编写的。
我有一个带有水平的UITableView单元格。当我非常快速地上下滚动表格视图并且不让它在设备(iPad Air 2,iOS 9.3.2)或模拟器上停止时,应用程序崩溃UICollectionViewFlowLayout
EXC_BAD_ACCESS
Run Code Online (Sandbox Code Playgroud)
在 AppDelegate 中。
该应用程序未达到在视图控制器中设置的断点didReceiveMemoryWarning()。
似乎代码崩溃了
[UICollectionViewData invalidateItemsAtIndexPaths:]
Run Code Online (Sandbox Code Playgroud)
或者
[_UIFlowLayoutSection computeLayoutInRect:forSection:invalidating:]
Run Code Online (Sandbox Code Playgroud)
其次是
0_dispatch_barrier_async_f_slow.
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪不会将我指向任何应用程序代码行。
模拟器的控制台堆栈跟踪(在设备上崩溃时没有控制台堆栈跟踪):
*** 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
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我能做些什么来防止这种情况发生?
编辑:根据Doro的要求,这是我的 cellForRowAtIndexPath:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(customCellNibName, forIndexPath: indexPath) as! CustomTableViewCell
//populating cell with data
return cell
}
Run Code Online (Sandbox Code Playgroud)
我根本不打电话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
Run Code Online (Sandbox Code Playgroud)
编辑2:
在我CustomTableViewCell的awakeFromNib()方法中,我有以下代码:
if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
layout.estimatedItemSize = CGSizeMake(50, 22)
}
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我将其注释掉,则不会再出现崩溃(尽管有时整个表视图会冻结并且无法使用)。但是,集合视图单元格的大小不正确。比较:对与错。
在 IB 中,Collection View Flow Layout -> Item Size 为 50x22。用于集合视图的单元格中有一个按钮,高度限制为 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
}
Run Code Online (Sandbox Code Playgroud)
这个想法是让这些单元格高 22pt,宽度不同(大约 50pt),它们之间的距离相同。我可以在不调用注释时防止崩溃的代码的情况下实现这一目标吗?
查看本教程。
基本上,这种情况可能会发生,因为 UITableViewCell 的可重用性至关重要。当您滚动 tableView 时,它使用同一组可见单元格,并通过您的方法设置内容cellForRowAtIndexPath:。
根据您的实现, UICollectionViewFlowLayout 似乎在特定时间点被释放。我的意思是,你已经打电话给
func setCollectionViewLayout(_ layout: UICollectionViewLayout,
animated animated: Bool)
Run Code Online (Sandbox Code Playgroud)
当您滚动时cellForRowAtIndexPath:,新的 UICollectionViewLayout 会被分配并设置为单元格内的 collectionView。在编辑方案 -> 诊断 -> 启用僵尸对象中启用僵尸对象。检查当前状态的正确性。
很难建议任何工作片段,但作为一个想法,尝试在 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;
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
1760 次 |
| 最近记录: |