使用谓词过滤后,我在 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 出现错误的主要内容,如果未能解决你的问题,请参考以下文章

过滤后的tableView的indexPath

SwiftUI 中的动态过滤器(谓词)

通过 UISearchBar 过滤后 UITableView 不滚动顶部

核心数据和关系谓词

使用谓词过滤 pyarrow.parquet.ParquetDataset 中的行

大数据SparkSql连接查询中的谓词下推处理