2015-04-18 48 views
0

您好我正在尝试使用核心数据和NSFetchedResults控制器实现表视图的搜索栏功能。IOS/xcode:带有NSFETched结果控制器的TableView的搜索栏

相当数量的答案上SO建议使用类似下面的代码使用谓词用于搜索:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if ([searchText length] == 0) { 
     _fetchedResultsController = nil; 
    } 
    else { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains[cd] %@", searchText]; 
     [[_fetchedResultsController fetchRequest] setPredicate:predicate]; 
     [[_fetchedResultsController fetchRequest] setFetchLimit:50]; 
    } 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    } 

    [[self tableView] reloadData]; 
} 

我也尝试过这种变化。然而,在任何情况下,我都有同样的问题。

首先,当您搜索时,它说没有结果。此外,如果您输入几个字母并点击x,则会出现灰色屏幕,如果再次点击,则会显示正常的表格视图。

但是,如果您单击取消,则在输入信件并看到“无结果”后,您将得到您应该得到的结果。一旦发生这种情况,您无法在不重建项目的情况下返回完整的表格视图。

我到目前为止唯一的想法是它可能与_fetchedResultsController vs fetchedResultsController(该源文件中的属性为ftchedResultsController,不带下划线)有关,但更改这些只会引发错误消息。

非常感谢您对可能造成这种情况的任何建议。

+0

您是否承诺将FRC用于搜索结果,或者您会考虑使用替代方法吗? – andrewbuilder

+0

我会考虑一种替代方法,如果它工作,并且很简单。 – user1904273

+0

你是在使用故事板和一个搜索控制器对象放入你的'UITableViewController'中吗? – andrewbuilder

回答

1

您有两个表视图,一个来自搜索,另一个来自主表。如果要继续使用搜索隐含的过滤器显示主表视图,应该禁用搜索控制器的表视图。

self.searchResultsController.active = NO; 

你可以这样的搜索栏,否则在textDidChange将其设置为YES,像每一个时间设定。在您的FRC获取器中,检查搜索栏中的任何字符串,并根据需要添加谓词。在textDidChangenil出FRC和reloadData。而已。

+0

那去哪?我在_fetchedResultsController = nil后尝试了它;并得到相同的结果。 – user1904273

+0

它应该始终被禁用。如果您不想使用搜索显示控制器,则可以将搜索栏全部替换为UITextField。 - 另外,如果将FRC设置为零并且它是懒惰地创建的,则只需调用'reloadData'即可。搜索栏逻辑应位于您的FRC创建代码中。 – Mundi

+0

对不起,我应该把上面的代码放在哪里?在viewdidload?尝试在viewdidload和viewwillappear没有成功。 – user1904273

相关问题