8

Ich habe eine UISearchBar als Unteransicht zu einem UICollectionView hinzugefügt und an eine UISearchDisplayController angeschlossen.UISearchBar in einer UICollectionView verschwindet mit UISearchDisplayController

ich es in viewDidLoad einzurichten:

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.delegate = self; 
self.searchController.searchResultsDataSource = self; 
self.searchController.searchResultsDelegate = self; 

[self.collectionView addSubview:self.searchBar]; 

Wenn ich eine andere Ansicht-Controller an die Navigationssteuerung drücken Sie es dann Pop, verschwindet die Suchleiste. Dies ist nur der Fall, wenn in der Sammlungsansicht so weit gescrollt wird, dass die Suchleiste ausgeblendet wird. Auch wenn die Suchleiste nicht mehr angezeigt wird, wird durch Antippen des weißen Bereichs, in dem sie angezeigt werden soll, der Suchanzeigesteuerelement aktiviert.

Dies geschieht nur auf iOS 7, und wenn ich den Search Display Controller entferne, wird die Suchleiste nicht verschwinden.

Noch eine erwähnenswerte Sache. Wenn die Suchleiste verschwunden ist, wenn ich einen anderen View-Controller drücke und dann die Taste drücke, wird die Leiste wieder sichtbar.

Offenbar ist dies ein Fehler von UISearchDisplayController auf iOS 7, also irgendwelche Ideen, wie man es umgehen kann?

+0

Sie eine Lösung gefunden? Ich stoße auf das gleiche Problem. Dem Kopf der Auflistungsansicht wurde eine UISearchDisplayController.uisearchbar hinzugefügt. Wenn der Benutzer zu einer anderen Ansicht wechselt und zurückkehrt. Die Uisearchbar wird verschwinden. Es könnte jedoch immer noch aktiv sein, wenn der Benutzer auf den leeren Bereich klickt. –

+0

Ich konnte kein Workout finden, daher schrieb ich "UISearchDisplayController" auf eigene Faust neu. –

+0

Sie meinen, Sie animieren das aktive auf uisearchbar und fügen Sie das uitableview selbst hinzu? Eigentlich brauche ich nur die "aktive" Animation. Nicht sicher, ob es einen einfachen Weg gibt, einen ähnlichen Effekt zu erzeugen. –

Antwort

4

Ich landete selbst UISearchDisplayController implementieren. Hier ist mein Code.

ZBNSearchDisplayController.h

@protocol ZBNSearchDisplayDelegate; 

@interface ZBNSearchDisplayController : NSObject<UISearchBarDelegate> 

- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController; 
- (void)setActive:(BOOL)visible animated:(BOOL)animated; 

@property(nonatomic,assign) id<ZBNSearchDisplayDelegate> delegate; 
@property(nonatomic, getter = isActive) BOOL active; 
@property(nonatomic, readonly) UISearchBar *searchBar; 
@property(nonatomic, readonly) UIViewController *searchContentsController; 
@property(nonatomic, readonly) UITableView *searchResultsTableView; 
@property(nonatomic, assign) id<UITableViewDataSource> searchResultsDataSource; 
@property(nonatomic, assign) id<UITableViewDelegate> searchResultsDelegate; 

@end 

@protocol ZBNSearchDisplayDelegate <NSObject> 

@optional 

- (void)searchDisplayControllerWillBeginSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerDidBeginSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerWillEndSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerDidEndSearch:(ZBNSearchDisplayController *)controller; 
- (void)textDidChange:(NSString *)searchText; 
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope; 

@end 

ZBNSearchDisplayController.m

#import "ZBNSearchDisplayController.h" 

@implementation ZBNSearchDisplayController 

- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController { 
    self = [super init]; 

    if (self) { 
     _searchBar = searchBar; 
     _searchBar.delegate = self; 
     _searchContentsController = viewController; 

     CGFloat y = 64.0f; 
     CGFloat height = _searchContentsController.view.frame.size.height - y; 

     _searchResultsTableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0f, y, _searchContentsController.view.frame.size.width, height)]; 
     _searchResultsTableView.scrollsToTop = NO; 
    } 

    return self; 
} 

- (void)setSearchResultsDataSource:(id<UITableViewDataSource>)searchResultsDataSource { 
    _searchResultsTableView.dataSource = searchResultsDataSource; 
} 

- (void)setSearchResultsDelegate:(id<UITableViewDelegate>)searchResultsDelegate { 
    _searchResultsTableView.delegate = searchResultsDelegate; 
} 

- (void)setActive:(BOOL)visible animated:(BOOL)animated { 
    if (!visible) { 
     [_searchBar resignFirstResponder]; 
     _searchBar.text = nil; 
     _searchBar.showsCancelButton = NO; 
    } 

    if (visible && [self.delegate respondsToSelector:@selector(searchDisplayControllerWillBeginSearch:)]) { 
     [self.delegate searchDisplayControllerWillBeginSearch:self]; 
    } else if (!visible && [self.delegate respondsToSelector:@selector(searchDisplayControllerWillEndSearch:)]) { 
     [self.delegate searchDisplayControllerWillEndSearch:self]; 
    } 

    [_searchContentsController.navigationController setNavigationBarHidden:visible animated:YES]; 

    float alpha = 0; 

    if (visible) { 
     [_searchContentsController.view addSubview:_searchResultsTableView]; 
     alpha = 1.0; 
    } 

    if ([_searchContentsController.view respondsToSelector:@selector(scrollEnabled)]) { 
     ((UIScrollView *)_searchContentsController.view).scrollEnabled = !visible; 
    } 

    if (animated) { 
     [UIView animateWithDuration:0.2 animations:^{ 
      _searchResultsTableView.alpha = alpha; 
     } completion:^(BOOL finished) { 
      self.active = visible; 
     }]; 
    } else { 
     _searchResultsTableView.alpha = alpha; 
    } 
} 

#pragma mark - UISearchBarDelegate 

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope { 
    if ([self.delegate respondsToSelector:@selector(searchBar:selectedScopeButtonIndexDidChange:)]) { 
     [self.delegate searchBar:searchBar selectedScopeButtonIndexDidChange:selectedScope]; 
    } 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
    if ([self.delegate respondsToSelector:@selector(textDidChange:)]) { 
     [self.delegate textDidChange:searchText]; 
    } 
} 

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    [searchBar setShowsCancelButton:YES animated:YES]; 
    [self setActive:YES animated:YES]; 
    [_searchResultsTableView reloadData]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [_searchResultsTableView reloadData]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [self setActive:NO animated:YES]; 
    [self.searchResultsTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
} 

@end 
Verwandte Themen