2015-12-09 20 views
6

我會在我的應用程序中實現SearchBar概念,但它有一個bug,當我在搜索欄中輸入第一個字符時,它不工作,tableview不顯示相關字段,它顯示空的tableview,但我輸入第二個字符顯示tableview中的相關字段,我不知道是什麼錯誤讓我請幫助我。輸入第一個字符時UISearchBar不工作?

這裏我給我的代碼。

-(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]; 
    });  
} 
+0

有更多的信息需要正確回答問題,你可以編輯它添加'getSearchJsonResponse'代碼? – juanjo

+0

同意@juanjo。我們需要更多信息爲您提供更好的答案。看起來您似乎在同步發送Web服務電話,這不是最佳做法。如果我們有更多的信息,我們可以幫助您解決這個問題和您的主要問題。 – Alexander

+0

從您發佈的代碼中,我確信它是完全正確的..問題必須在'getJsonResponse'或'getSearchJsonResponse'方法 –

回答

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」)?

+0

不工作... @Jan Greve。 –

+0

不工作,無論如何謝謝.. @ Jan Greve –

+0

您能否通過一個字符提供成功搜索的日誌結果?我認爲罪魁禍首可能是你在錯誤處理方面的失敗。 – SmokeDispenser

0

取兩陣一個信息搜索結果& 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中的其他部分還添加此

if (tableView == self.searchDisplayController.searchResultsTableView) 
{ 
    cell.textLabel.text = [self.searchResult objectAtIndex:indexPath.row]; 
} 
+0

我會嘗試這個,但不能正常工作...... @ Uma Madhavi。 –

0

似乎你的tableView在json調用完成之前重新加載。 嘗試用completionBlock:

-(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);} 
-1

當文本的搜索欄文本框編輯,那麼這代表獲取調用。

- (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; 
} 
+0

這種方法不適用於UISearchBar,這將爲UITextField工作。 –

0

您應該使用- (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來更新搜索結果。

0

嘗試使用傳入的'searchText'值,而不是嘗試將值從UI組件中拉出。 'searchText'應該始終具有正確的值。 'searchBar.text'可能尚未更新。

0

你可以試試這個代碼:

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]; 
     }); 
    }]; 
} 

也許功能集合請求你可以不同。

0

而不是檢查搜索欄上的文本,您必須使用searchText。

我正在做同樣的事情,這解決了我的問題。希望它也能幫助你。

相關問題