输入第一个字符时 UISearchBar 不起作用?

Posted

技术标签:

【中文标题】输入第一个字符时 UISearchBar 不起作用?【英文标题】:UISearchBar not working when enter the first character? 【发布时间】:2015-12-09 10:55:45 【问题描述】:

我将在我的应用程序中实现 SearchBar 概念,但它有一个错误,当我在搜索栏中输入第一个字符时它不起作用并且 tableview 不显示相关字段并且它显示空 tableview 但我输入它显示的第二个字符tableview中的相关字段,我不知道我犯了什么错误请帮助我。

我在这里给出我的代码。

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
       NSLog(@"searching::");
       if(searchBar.text.length == 0)
       
            [searchDict removeAllObjects];
            [arrayDict removeAllObjects];
            searchDict=[[NSMutableArray alloc]init];
            arrayDict=[[NSMutableArray alloc]init];
            [self getJsonResponse];
            [self.tableView reloadData];    
        else 
            [arrayDict removeAllObjects];
            arrayDict=[[NSMutableArray alloc]init];
       
       dispatch_async(dispatch_get_main_queue(), ^
       [self getSearchJsonResponse:searchBar.text];
       NSLog(@"searchDict::%@",searchDict);
       [self.tableView reloadData];
   );    

【问题讨论】:

正确回答问题需要更多信息,您可以编辑它添加getSearchJsonResponse的代码吗? 同意@juanjo。我们需要更多信息来为您提供更好的答案。似乎您正在同步发送 Web 服务调用,这不是最佳实践。如果我们有更多信息,我们可以帮助您解决这个问题和您的主要问题。 从您发布的代码来看,我确信它完全没问题.. 问题必须在getJsonResponsegetSearchJsonResponse 方法中 @saravana - 你的问题已经解决了,兄弟…… 【参考方案1】:

根据聊天中的代码,您需要彻底检查代码是否存在内存泄漏和性能问题。到处都是。

除此之外,进行以下更改以使您的代码有机会工作:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
  if(searchBar.text.length == 0) 
    [searchDict removeAllObjects];
    [arrayDict removeAllObjects];
    [self getJsonResponse];
     
  else 
    [arrayDict removeAllObjects];
    [self getSearchJsonResponse:searchBar.text];
    

另外,将[self.tableView reloadData] 包装到 Web 服务完成块中的主队列中,如下所示:

dispatch_async(dispatch_get_main_queue(), ^
   [self.tableView reloadData];
);

另外,NSLog(@"SEARCHDICT::%@",searchDict); 记录了什么?是否有可能您缺乏错误处理正在吞噬失败的 Web 服务调用响应(例如,空搜索栏或“我不是在搜索长度 1”)?

【讨论】:

不工作...@Jan Greve。 你能提供一个字符的成功搜索的日志结果吗?我认为罪魁祸首可能是您在错误处理方面的失败。【参考方案2】:

似乎您的 tableView 在 json 调用完成之前已重新加载。 尝试完成块:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
NSLog(@"searching::");
if(searchBar.text.length == 0)

    [searchDict removeAllObjects];
    [arrayDict removeAllObjects];

    //Reload when networkcall is complete
   [self getJsonResponseWithCompletionBlock:^(NSMutableArray *allResults, NSError *error) 
        //if no error fill Dictionary and reload ...

        [self.tableView reloadData];
    ];
 else 
   ...

对于像这样的 json 调用

-(void)getJsonResponseWithCompletionBlock:(void(^)(NSMutableArray *allResults, NSError *error))completionBlock 

//Do what ever is needed to get data
//...

//when data is ready call block
completionBlock(allResults,nil);

【讨论】:

【参考方案3】:

您应该使用- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 方法来获取在UISearchBar 中输入的文本。方法看起来像

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text 

NSString * txt = [searchBar.text stringByReplacingCharactersInRange:range withString:text];    
return YES;

这里的“txt”是出现在UISearchBar 中的文本。现在您可以使用“txt”字符串过滤结果。在UISearchBarController tableview 上调用reload 以更新搜索结果。

【讨论】:

【参考方案4】:

尝试使用传入的“searchText”值,而不是尝试从 UI 组件中提取值。 'searchText' 应该始终具有正确的值。 'searchBar.text' 可能尚未更新。

【讨论】:

【参考方案5】:

你可以试试这个代码:

if ([searchText isEqualToString:@""])

    [searchDict removeAllObjects];
        [arrayDict removeAllObjects];
    dispatch_async(dispatch_get_main_queue(), ^
        [self.searchResultController.tableView reloadData];
    );

[YourController cancelPreviousPerformRequestsWithTarget:self selector:@selector(applySearch) object:nil];
if (![searchBar.text isEqualToString:@""]) 
    [self performSelector:@selector(applySearch) withObject:nil afterDelay:1];

使用 ApplySearch:

- (void)applySearch
    [self getSearchJsonResponse:searchBar.text];

我认为getSearchJsonResponse:应该是:

- (void)getSearchJsonResponse:(NSString *)text 
     //Maybe like this:
     [self getJsonResponseWithCompletionBlock:^(NSMutableArray *allResults, NSError *error) 
    dispatch_async(dispatch_get_main_queue(), ^
            [self.tableView reloadData];
        );
    ];

也许你的功能集要求可能不同。

【讨论】:

【参考方案6】:

取两个数组一个searchResult & tabledataArr

在 ViewDidLoad 中添加这个

self.searchResult = [NSMutableArray arrayWithCapacity:[dataArr count]];

添加搜索栏委托

-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope  


  [self.searchResult removeAllObjects];
  NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchText];

  self.searchResult = [NSMutableArray arrayWithArray: [dataArr filteredArrayUsingPredicate:resultPredicate]];



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


  [self filterContentForSearchText:searchString scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];

  return YES;



-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section


  if (tableView == self.searchDisplayController.searchResultsTableView)
  
    return [self.searchResult count];
  
 else
 
    return [dataArr count];
 

在 CellForRowAtIndex 中也在 else 部分添加这个

if (tableView == self.searchDisplayController.searchResultsTableView)

    cell.textLabel.text = [self.searchResult objectAtIndex:indexPath.row];

【讨论】:

我会试试这个但不能正常工作...@Uma Madhavi。【参考方案7】:

您必须使用 searchText,而不是检查搜索栏上的文本。

我也在做同样的事情,这解决了我的问题。希望对你也有帮助。

【讨论】:

【参考方案8】:

在搜索栏文本字段中编辑文本时,将调用此委托。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
    NSString *text = [[textField text] stringByReplacingCharactersInRange:range withString:string];
    // make search call with updated text.
    [self startSeachWithText:text];
    return YES;

【讨论】:

此方法不适用于 UISearchBar,但适用于 UITextField。

以上是关于输入第一个字符时 UISearchBar 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

在 xib 中将 UISearchBar 添加为 tableHeaderView 不起作用

UISearchBar 的 setRightView 在 iOS 7 中不起作用

UISearchBar 的自定义 InputView 在 iOS7 中不起作用

Swift & Parse:UISearchbar 不起作用

更改 UISearchBar textColor 不起作用

文本字段一个字符并自动更改为下一个文本字段?不起作用?