tec*_*vvy 25 iphone objective-c uitableview uisearchbar ios7
我有一个tableview在我的应用程序中显示设备列表.当调用viewWillAppear时,我添加了self.searchDisplayController.searchBar as a subview to a headerView.然后我分配self.tableView.tableHeaderView = headerView.它看起来像这样:

我向下滚动tableview,以便headerview不在视图中,然后通过点击单元格转到其他视图控制器.当我回到这个tableView时,向上滚动到headerView,searchBar变得不可见,但是在点击不可见区域时,searchDisplayController被激活并且取消按钮不起作用.这仅适用于iOS 7.为什么会这样?
注意:当我回到tableViewController时,只有当headerView不在视图中时才会发生.
小智 18
我刚才有同样的问题.当我在最终搜索状态下调试UISearchDisplayController的委托方法时,searchBar成为UIView的子视图,而不是UITableView.请看下面的代码:
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
//My Solution: remove the searchBar away from current super view,
//then add it as subview again to the tableView
UISearchBar *searchBar = controller.searchBar;
UIView *superView = searchBar.superview;
if (![superView isKindOfClass:[UITableView class]]) {
NSLog(@"Error here");
[searchBar removeFromSuperview];
[self.tableView addSubview:searchBar];
}
NSLog(@"%@", NSStringFromClass([superView class]));
}
Run Code Online (Sandbox Code Playgroud)
我的解决方案是将searchBar从当前的超级视图中移除,然后再次将其作为子视图添加到tableView.我已经成功测试了.希望有所帮助!
问候
我有完全一样的问题.搜索栏仍然存在,可以接收触摸事件.然而,它没有呈现.我相信问题出在UISearchDisplaycontroller中,因为如果我不使用UISearchDisplayController它会呈现正常.我最终编写了一个自定义的SearchDisplaycontroller来替换它.这是非常基本的,只做我需要的.
使用它与普通的UISearchDisplayController一样,但self.searchDisplayController不会返回任何内容.您将不得不使用另一个指针来引用自定义搜索显示控制器.
看起来像一个大丑陋的工作,但唯一一个适合我的工作.渴望听到其他选择.
@protocol SearchDisplayDelegate;
@interface SearchDisplayController : NSObject<UISearchBarDelegate>
- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController;
@property(nonatomic,assign) id<SearchDisplayDelegate> delegate;
@property(nonatomic,getter=isActive) BOOL active; // configure the view controller for searching. default is NO. animated is NO
- (void)setActive:(BOOL)visible animated:(BOOL)animated; // animate the view controller for searching
@property(nonatomic,readonly) UISearchBar *searchBar;
@property(nonatomic,readonly) UIViewController *searchContentsController; // the view we are searching (often a UITableViewController)
@property(nonatomic,readonly) UITableView *searchResultsTableView; // will return non-nil. create if requested
@property(nonatomic,assign) id<UITableViewDataSource> searchResultsDataSource; // default is nil. delegate can provide
@property(nonatomic,assign) id<UITableViewDelegate> searchResultsDelegate;
@end
@protocol SearchDisplayDelegate <NSObject>
// implement the protocols you need
@optional
@end
Run Code Online (Sandbox Code Playgroud)
实施
@implementation SearchDisplayController {
UISearchBar *_searchBar;
UIViewController *_viewController;
UITableView *_searchResultsTableView;
UIView *_overLay;
}
- (void)dealloc {
[_searchBar release];
[_searchResultsTableView release];
[_overLay release];
[super dealloc];
}
- (UIViewController *)searchContentsController {
return _viewController;
}
- (UITableView *)searchResultsTableView {
return _searchResultsTableView;
}
- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController {
self = [super init];
if (self) {
_searchBar = [searchBar retain];
_searchBar.delegate = self;
_viewController = viewController;
_searchResultsTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, CGRectGetMaxY(_searchBar.frame), _viewController.view.frame.size.width, _viewController.view.frame.size.height - CGRectGetMaxY(_searchBar.frame))];
_overLay = [[UIView alloc]initWithFrame:_searchResultsTableView.frame];
_overLay.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(overLayTapped)];
[_overLay addGestureRecognizer:tap];
[tap release];
}
return self;
}
- (void)setSearchResultsDataSource:(id<UITableViewDataSource>)searchResultsDataSource {
_searchResultsTableView.dataSource = searchResultsDataSource;
}
- (void)setSearchResultsDelegate:(id<UITableViewDelegate>)searchResultsDelegate {
_searchResultsTableView.delegate = searchResultsDelegate;
}
- (void)overLayTapped {
[self setActive:NO animated:YES];
[_searchBar resignFirstResponder];
_searchBar.text = nil;
_searchBar.showsCancelButton = NO;
}
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
UIView *viewToAdd = nil;
if (!_searchBar.text.length) {
viewToAdd = _overLay;
} else {
viewToAdd = _searchResultsTableView;
}
float a = 0;
if (visible) {
[_viewController.view addSubview:viewToAdd];
a = 1.0;
}
if ([_viewController.view respondsToSelector:@selectore(scrollEnabled)]) {
((UIScrollView *)_viewController.view).scrollEnabled = !visible;
}
if (animated) {
[UIView animateWithDuration:0.2 animations:^{
_overLay.alpha = a;
_searchResultsTableView.alpha = a;
}];
} else {
_overLay.alpha = a;
_searchResultsTableView.alpha = a;
}
}
- (void)setActive:(BOOL)active {
[self setActive:active animated:YES];
}
#pragma mark - UISearchBar delegate protocols
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
[self setActive:YES animated:YES];
searchBar.showsCancelButton = YES;
[_searchResultsTableView reloadData];
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
[_searchResultsTableView reloadData];
}
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
[self overLayTapped];
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if (searchText.length) {
[_overLay removeFromSuperview];
[_viewController.view addSubview:_searchResultsTableView];
} else {
[_searchResultsTableView removeFromSuperview];
[_viewController.view addSubview:_overLay];
}
[_searchResultsTableView reloadData];
}
@end
Run Code Online (Sandbox Code Playgroud)
更新:关于如何使用此程序
宣布伊娃
SearchDisplayController *mySearchDisplayController;
Run Code Online (Sandbox Code Playgroud)
以编程方式初始化它
mySearchDisplayController = [[SearchDisplayController alloc]initWithSearchBar:mySearchBar contentsController:self];
Run Code Online (Sandbox Code Playgroud)
将搜索栏添加到您的tableview
self.tableView.headerView = mySearchBar;
Run Code Online (Sandbox Code Playgroud)
使用mySearchDisplayController作为对custon类的引用,而不是self.searchDisplayController.
| 归档时间: |
|
| 查看次数: |
11529 次 |
| 最近记录: |