2011-02-24 2 views
2

13,000 개의 셀을 통해 텍스트를 검색하는 앱이 있습니다. 나는 그것이 많은 세포라는 것을 압니다. 구형 아이폰에서는 수초가 걸리므로 앱이 여전히 작동하고 있음을 사용자에게 보여주는 지표보기를 제공하고 싶습니다. UISearchBar 돋보기를 UIActivityIndicatorView로 변경하는 아이디어를 생각해 냈습니다. 코드는 시뮬레이터에서 작동하지만 이전 iPod touch에서 테스트 할 때 스피너가 표시되지 않습니다. 검색이 완료된 후에 만 ​​실제로 표시됩니다. 왜 그런가? 여기에 코드가 있습니다.돋보기를 UIActivityIndicatorView로 변경하십시오.

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
UIActivityIndicatorView *spin = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
CGRect spinnerFrame = CGRectMake(12.0, 12.0, 20.0, 20.0); 
spin.frame = spinnerFrame; 
spin.clipsToBounds = YES; 
spin.backgroundColor = [UIColor whiteColor]; 
[searchBar addSubview:spin]; 
[spin startAnimating]; 
[self performSelectorOnMainThread:@selector(filterContentForSearchText:) withObject:searchBar.text waitUntilDone:YES]; 
[spin stopAnimating]; 
[spin removeFromSuperview]; 
//[self filterContentForSearchText:searchBar.text]; 
[self.searchDisplayController.searchContentsController.navigationController setNavigationBarHidden:NO animated:YES]; 
[self.searchDisplayController.searchResultsTableView reloadData]; 

}

답변

1

이 당신의 검색 창을 교체 :

@interface _SearchBarWithSpinner : UISearchBar 
{ 
    UIActivityIndicatorView *_spinnerView; 
    UIView     *_searchIconView; 
    UITextField    *_internalTextField; 
} 

- (void)showSpinner; 
- (void)hideSpinner; 

@end 

@implementation _SearchBarWithSpinner 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(textFieldDidBeginEditingNotification:) 
                name:UITextFieldTextDidBeginEditingNotification 
                object:nil]; 
    } 

    return self; 
} 

- (void)showSpinner 
{ 
    if(_internalTextField) 
    { 
     if(_spinnerView == nil) 
      _spinnerView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

     [_internalTextField setLeftView:_spinnerView]; 
     [_spinnerView startAnimating]; 
    } 
} 

- (void)hideSpinner 
{ 
    [_spinnerView stopAnimating]; 
    [_internalTextField setLeftView:_searchIconView]; 
} 

#pragma mark - Private 

- (void)textFieldDidBeginEditingNotification:(NSNotification *)notification 
{ 
    if(_internalTextField == nil) 
    { 
     UITextField *editedTextField = notification.object; 
     UIView  *superView   = editedTextField.superview; 

     while(superView && superView != self) 
      superView = superView.superview; 

     if(superView == self) 
     { 
      _internalTextField = editedTextField; 
      _searchIconView  = _internalTextField.leftView; 
     } 
    } 
} 

@end 
관련 문제