2013-08-23 32 views
2

我在表格視圖中實施了一個搜索欄。一切都好。爲了定製原因,我確實在視圖控制器中嵌入了兩者。由於此時應用程序在搜索欄中輸入第一個字符後會凍結。之後暫停/取消暫停應用顯示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

儀器告訴你什麼?運行時間分析器並查看發生了什麼。 –

+0

時間剖析器顯示了高度的1/4。我在我的quadcore上使用了這種方法,即一個內核處於滿載狀態。 – MPajak

+0

並查看欄下方的數據(屏幕下半部分)。什麼代碼正在運行? –

回答

0

與此同時,我找到了解決問題的方法,但仍不明白爲什麼它現在正在工作。在viewDidLoad中我加了初始化後的行:

[self searchDisplayController:self.searchController didLoadSearchResultsTableView:self.searchController.searchResultsTableView]; 

現在的搜索欄也正在爲第一次搜索。

1

每一次被調用-searchDisplayController:shouldReloadTableForSearchString:您正在創建一個新的獲取結果控制器並重新載入您的表視圖。性能往往會這樣做。

相關問題