使用谓词过滤后,我在 tableview 中的 cellForRowAtIndexPath 出现错误
Posted
技术标签:
【中文标题】使用谓词过滤后,我在 tableview 中的 cellForRowAtIndexPath 出现错误【英文标题】:I am getting error at my cellForRowAtIndexPath in tableview after i filter with predicate 【发布时间】:2017-10-04 02:46:54 【问题描述】:[__NSDictionaryM safeObjectAtIndex:]:无法识别的选择器发送到实例 0x60800005e060
[__NSDictionaryM safeObjectAtIndex:]: 无法识别的选择器发送到实例 0x60800005e060 [IssuesViewController-tableView:cellForRowAtIndexPath:]
-[STCollapseTableView _configureCellForDisplay:forIndexPath:] 中的断言失败,/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.7.47/UITableView.m:8174
由于未捕获的异常 'NSInternalInconsistencyException' 导致应用程序终止,原因:'UITableView (; layer = ; contentOffset: 0, 0; contentSize: 414, 115>) 未能从其 dataSource (; layer = ; contentOffset: 0, 0; contentSize: 414, 115>)' *** 首先抛出调用栈:
( 0 CoreFoundation 0x0000000108d8bb0b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00000001087c3141 objc_exception_throw + 48
2 CoreFoundation 0x0000000108d8fcf2 +[NSException raise:format:arguments:] + 98
3 Foundation 0x000000010835d3b6 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
4 UIKit 0x0000000109aeefcf -[UITableView _configureCellForDisplay:forIndexPath:] + 230
5 UIKit 0x0000000109afa7b8 -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 836
6 UIKit 0x0000000109afa9a8 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 74
7 UIKit 0x0000000109acf2e9 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2845
8 UIKit 0x0000000109b0397c -[UITableView _performWithCachedTraitCollection:] + 111
9 UIKit 0x0000000109aeab2a -[UITableView layoutSubviews] + 233
10 UIKit 0x0000000109a5120b -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1268
11 QuartzCore 0x0000000107905904 -[CALayer layoutSublayers] + 146
12 QuartzCore 0x00000001078f9526 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 370
13 QuartzCore 0x00000001078f93a0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
14 QuartzCore 0x0000000107888e92 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
15 QuartzCore 0x00000001078b5130 _ZN2CA11Transaction6commitEv + 468
16 UIKit 0x0000000109987307 _UIApplicationFlushRunLoopCATransactionIfTooLate + 167
17 UIKit 0x000000010a187cab __handleEventQueue + 5843
18 CoreFoundation 0x0000000108d31c01 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
19 CoreFoundation 0x0000000108d170cf __CFRunLoopDoSources0 + 527
20 CoreFoundation 0x0000000108d165ff __CFRunLoopRun + 911
21 CoreFoundation 0x0000000108d16016 CFRunLoopRunSpecific + 406
22 GraphicsServices 0x000000010b8eaa24 GSEventRunModal + 62
23 UIKit 0x000000010998e0d4 UIApplicationMain + 159
24 comress 0x000000010626910f main + 111
25 libdyld.dylib 0x000000010b4d765d start + 1)
libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)
这是示例代码:
NSArray *postDupe = [[_postsArray valueForKeyPath:@"@unionOfArrays.@allValues"] valueForKeyPath:@"post"];
NSArray *foundArray = nil;
predicate = [NSPredicate predicateWithFormat:@"post_id.stringValue contains [c] %@",@"18586"];
foundArray = [postDupe filteredArrayUsingPredicate:predicate];
long foundIndex = 0;
long count = 0;
for (int i=0; i<foundArray.count; i++)
foundIndex = [postDupe indexOfObject: [foundArray objectAtIndex: i]];
//NSLog(@"%@ is at index %d", string, index);
_filterPostsArray = [_postsArray objectAtIndex:foundIndex];
searchActive = YES;
dispatch_async(dispatch_get_main_queue(),^
[_issuesTable reloadData];
);
Json 数据示例:
<__NSArrayM 0x608000449a80>(
14556 =
newCommentsCount = 0;
post =
"post_id" = 18609;
seen = 1;
status = 0;
statusWasUpdated = 0;
"updated_on" = "1506061049.023";
;
;
,
)
【问题讨论】:
您显示的数据是一个字典,它有一个键14556
,它也是字典值,嵌套字典有一个键post
,它也是字典值,最后那个字典有键post_id
。你的_postsArray
里到底有什么?最终的内部字典还是别的什么?
@CRD 这是其中的一部分,我还有其他数据集,例如 14557 等。该数组包含所有 dict 值
@CRD,所以无论如何要获得价值。
尝试在 SO 的搜索框中输入 [nspredicate] nested dictionary
之类的内容,看看嵌套词典上的许多问题是否对您有帮助。
如果你不使用 CoreData,我建议使用 predicateWithBlock:
: NSDictionary *subDict = [obj[allValues] firstObject];
return [subDict[@"post"] isEqualToString:@"myPostID18609"];` (如果它是一个字符串,如果是NSNumber
,则使用NSNumber
进行比较。
【参考方案1】:
[__NSDictionaryM safeObjectAtIndex:]: 无法识别的选择器发送到实例
看起来你有一本字典,并且把它当作一个数组来对待。
在调试器中运行您的代码,并在您通过算法时检查变量的值,这应该会告诉您哪里出错了。
猜测:
-
谓词
post_id.stringValue
中的键路径应为post.post_id.stringValue
- 您的字典包含键post
,其值本身就是具有键post_id
的字典。
_filterPostsArray = [_postsArray objectAtIndex:foundIndex]
听起来像是将字典分配给数组。您可能希望此语句在循环中并添加字典作为数组的新元素?
HTH
【讨论】:
以上是关于使用谓词过滤后,我在 tableview 中的 cellForRowAtIndexPath 出现错误的主要内容,如果未能解决你的问题,请参考以下文章
通过 UISearchBar 过滤后 UITableView 不滚动顶部