ios – UICollectionView中的UISearchBar在使用UISearchDisplayController时消失

前端之家收集整理的这篇文章主要介绍了ios – UICollectionView中的UISearchBar在使用UISearchDisplayController时消失前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UISearchBar作为子视图添加到UICollectionView,并附加到UISearchDisplayController.

我在viewDidLoad中设置它:

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

当我将另一个视图控制器推送到导航控制器然后弹出它时,搜索栏消失.仅当集合视图向下滚动到足以隐藏搜索栏时才会发生这种情况.此外,即使搜索栏消失,点击它应该激活的白色空间也会激活附加到它的搜索显示控制器.

这仅在iOS 7上发生,如果我删除搜索显示控制器,搜索栏将不会消失.

还有一件事值得一提.当搜索栏消失时,如果我按下另一个视图控制器然后弹出它,则该栏将再次可见.

显然这是iOS 7上UISearchDisplayController的一个bug,所以关于如何解决它的任何想法?

解决方法

我最终自己实现了UISearchDisplayController.这是我的代码.

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,1,1) animated:NO];
}

@end

猜你在找的iOS相关文章