如何使用搜索和ARC过滤NSFetchedResultsController中的CoreData数据

3
我找到了一个完美的答案来通过NSFetchedResultsController搜索:https://dev59.com/wW855IYBdhLWcg3wNhd1#4481896 编辑:显示问题的项目:http://cl.ly/2x0C0N0E4240 它似乎非常棒,但它没有编写使用ARC,我尝试只删除所有“retain”、“release”和“autorelease”。
它仍然有效,大部分情况下都可以,问题是,当我在搜索栏中输入一个字符时,它按预期显示过滤后的表格,但它只需要1个字符(如果您添加更多字符则不会发生任何事情),之后每次其他“搜索”都将显示第一个搜索结果。只需1个字符。
我已经在这上面花了两天时间,随处放置NSlog以查看何时调用每个方法,但仍然无法找到如何使其工作:(
谢谢!
编辑: 这是.m http://pastebin.com/9U4TfbA6 编辑:这里是.h http://pastebin.com/S9aaNRFE 此外,如果它有帮助,当我评论时搜索起作用:
- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController_! = nil)
    {
        return fetchedResultsController_;
    }
...
}

And this :

- (NSFetchedResultsController *)searchFetchedResultsController { 
    if (searchFetchedResultsController_ != nil)
    {
        return searchFetchedResultsController_;
    }
...
}

但它会破坏其他东西 :/
1个回答

3
我猜您是在处理搜索显示控制器的委托方法时出了问题,特别是需要检查这个方法。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;

因为这个方法会重新加载你的表视图以显示你在搜索字段中输入的每个字符,正如其名称所示 shouldReloadTableForSearchString

编辑:

好的,你需要实现UISearchBar的2个代理方法,因为你所有的UISearchDisplayController代理方法都是相同的,而这两个方法是

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

这将告知代理用户更改了搜索文本。
- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

如果指定范围内的文本应替换为给定的文本,则使用此选项。

请注意,这些方法将多次调用,即在搜索栏中添加和删除每个字符时都会调用它们,并且因为每次搜索文本更改时都要将searchFetchedResultsController设置为nil。

只需注释掉此部分内容即可使其正常工作。

/*if (searchFetchedResultsController_ != nil)
{
NSLog(@"Returned !nil searchController");
return searchFetchedResultsController_;
}*/

我马上就会放上我的代码,但它与上面链接的答案相似度达到了98%。 - ItsASecret
好的,现在一切都准备就绪了! :-) - ItsASecret
我要出去,两个小时后回来,非常感谢!我会告诉你进展如何的! - ItsASecret
我已经在我的回答中提到了它们下面的功能 :P - Charan
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/15844/discussion-between-sree-charan-and-clarisse - Charan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接