Iphone 未保留filteredArrayUsingPredicate数组

Iphone 未保留filteredArrayUsingPredicate数组,iphone,core-data,nspredicate,uisearchdisplaycontroller,Iphone,Core Data,Nspredicate,Uisearchdisplaycontroller,我有一个核心数据数据库,每一行都显示在一个表中 我有一个搜索控制器,使用户可以按名字或姓氏进行搜索 当我从“filteredArrayUsingPredicate”中得到结果时,我重新加载搜索控制器表,一切正常。该表显示了过滤结果 在选择结果时,结果数组为空,随后由于[array atIndex:index path.row]超出范围而崩溃。数组是空的,这让我觉得它已经被释放了 这段代码在另一个视图上非常有效。我尝试过重新写作,清理和构建,但仍然在发生——有什么想法吗 下面是我的代码 @属性(非

我有一个核心数据数据库,每一行都显示在一个表中

我有一个搜索控制器,使用户可以按名字或姓氏进行搜索

当我从“filteredArrayUsingPredicate”中得到结果时,我重新加载搜索控制器表,一切正常。该表显示了过滤结果

在选择结果时,结果数组为空,随后由于[array atIndex:index path.row]超出范围而崩溃。数组是空的,这让我觉得它已经被释放了

这段代码在另一个视图上非常有效。我尝试过重新写作,清理和构建,但仍然在发生——有什么想法吗

下面是我的代码

@属性(非原子,保留)NSArray*缓存搜索结果

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{


    NSPredicate * predicate =  [NSPredicate predicateWithFormat:@"first_name contains[cd] %@ || last_name contains[cd] %@",searchText, searchText];
    self.cachedSearchResults = [[self.cachedResults filteredArrayUsingPredicate:predicate]retain];
;
    [searchController.searchResultsTableView reloadData];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

PupilManagedObject* selected = nil;
if(tableView == table){
    selected = [cachedResults objectAtIndex:indexPath.row];
}else{
    selected = [self.cachedSearchResults objectAtIndex:indexPath.row]; //array is empty at this point
}
}

此代码缺少重要信息。据我所见,听起来您没有正确计算tableView:numberOfRowsInSection:。验证它是否为给定场景提供了正确的行数。

我发现问题在于,在我使用数组中的数据之前,搜索控制器被解除。奇怪的是,更改代码的顺序起了作用

谢谢-的确如此。在tableView:numberOfRowsInSection-cellForRowAtIndexPath中记录数组显示填充的数组。它似乎是在这和selections之间释放的,在tableView:didSelectRowAtIndexPath:中数组实际上是空的,还是被释放?我对变量“table”来自何处以及为什么需要在它们之间切换感到困惑。您是否已将索引路径记录到该函数中,以确保它符合您的期望?感谢您的回复。打印阵列时,它不是零,而是空的。比较的目的是检查是否从搜索控制器或表调用了委托。索引路径是正确的,问题是数组由于某种原因被清空。我在同一个应用程序中至少使用了5次完全相同的代码,没有任何问题。这很奇怪..你还想帮助什么代码?真的没有遗漏什么吗?显然有,因为在附加的代码中没有任何东西会建议释放数组中的对象。如果您需要帮助,您必须将更多源代码放到联机状态,可能需要使用GitHub。将数组记录在tableView:numberOfRowsInSection和cellForRowAtIndexPath中会显示一个正确填充的数组