3

我找到了通过 NSFetchedResultsController 搜索的完美答案:https ://stackoverflow.com/a/4481896/1486928

编辑:显示问题的项目: http: //cl.ly/2x0C0N0E4240

它看起来真的很棒,除了它不是为与 ARC 一起使用而编写的,我试图删除所有的“保留”“释放”“自动释放”。

它仍然有效,主要是,当我在搜索栏中输入一个字符时,它会按预期显示过滤后的表,但它只需要 1 个字符(如果你添加更多它不会做任何事情),然后每隔一个“ search" 将显示第一次搜索的结果,它只占用了 1 个字符。

我已经做了 2 天了,将 NSlog 放在任何地方,以查看何时调用每个方法,但仍然找不到如何使其工作:(

谢谢 !

编辑:这里是 .m http://pastebin.com/9U4TfbA6 编辑:这里是 .h http://pastebin.com/S9aaNRFE

另外,当我对此发表评论时,如果它可以帮助搜索工作:

- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController_! = nil)
    {
        return fetchedResultsController_;
    }
...
}

还有这个 :

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

但它搞砸了其他事情:/

4

1 回答 1

3

我猜你搞砸了搜索显示控制器委托方法,

特别是你需要检查这个方法

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString;

因为这个方法会为你在搜索字段中输入的每个字符重新加载你的表格视图,正如名称本身所暗示的那样shouldReloadTableForSearchString

编辑:

好吧,您需要实现 2 个委托方法,UISearchBar因为您的所有UISearchDisplayController委托方法都是相同的,而这 2 个方法是

- (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_;
}*/
于 2012-08-27T07:40:36.610 回答