我在表格视图中实现了一个搜索栏。一切都很好。出于自定义原因,我在视图控制器中嵌入了它们。从这一点开始,应用程序在将第一个字符键入搜索栏后冻结。在暂停之后暂停/取消暂停应用程序会显示debuger中的不同点,因此应用程序似乎正在运行并且在显示中我可以看到键盘上键入高位(更大)的字符。玩了一下之后我发现,当我第一次选择搜索栏时,但是没有输入任何内容并点击取消,这就解决了问题。在此之后,我可以按预期使用搜索栏。
我在互联网上搜索了几天,但没有找到解决这个问题的任何提示。所以欢迎任何帮助。
这里是我的代码:
-(void)viewDidLoad
[super viewDidLoad];
UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PhaseHintergrund"]];
[tempImageView setFrame:self.tableView.frame];
self.tableView.backgroundView = tempImageView;
self.searchItem = nil;
[[UISearchBar appearance] setSearchFieldBackgroundImage:[UIImage imageNamed:@"Suchleiste"]forState:UIControlStateNormal];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,320,44)];
searchBar.placeholder = @"Symptomsuche";
UIImage *myImage = [UIImage imageNamed: @"NavbarTransparent"];
searchBar.backgroundImage = myImage;
searchBar.delegate = self;
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
self.searchController.searchResultsTableView.separatorColor = self.tableView.separatorColor;
self.searchController.searchResultsTableView.backgroundView = tempImageView;
self.searchController.searchResultsTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.searchController.searchResultsTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self.tableView reloadData];
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell *cell = nil;
cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell2" forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
UITextView *symptom = (UITextView*) [cell viewWithTag:2];
symptom.text = (NSString*)[object valueForKey:@"name"];
-(BOOL)searchDisplayController:(UISearchDisplayController *)_controller shouldReloadTableForSearchString:(NSString *)searchString
self.searchItem = searchString;
self.fetchedResultsController = nil;
return YES;
-(void)searchDisplayController:(UISearchDisplayController *)_controller willUnloadSearchResultsTableView:(UITableView *)tableView
self.searchItem = nil;
self.fetchedResultsController = nil;
[self.tableView reloadData];
修改 在所有UISearchDisplayController委托方法中设置断点,我发现在出现错误的情况下(第一次使用搜索栏而没有取消之前)方法searchDisplayController:didLoadSearchResultsTableView:将不会被执行。所以在我看来,目前没有活动的tableview,这可能会导致问题/错误。
所以问题是我在初始化中遗漏或做错了什么,取消搜索对我来说有用吗?
答案 0 :(得分:1)
每次调用-searchDisplayController:shouldReloadTableForSearchString:
时,您都会创建一个新的获取结果控制器并重新加载表视图。对于表现,你可能经常这样做。
答案 1 :(得分:0)
与此同时,我找到了解决问题的方法,但仍然不明白为什么它现在正在运行。在viewDidLoad中,我在初始化后添加了以下行:
[self searchDisplayController:self.searchController didLoadSearchResultsTableView:self.searchController.searchResultsTableView];
现在,搜索栏也在进行第一次搜索。