iOS开发UISearchBar的使用及searchBar的成员属性解释
2016-03-24 10:18
489 查看
最近研究了一下UISearchBar,下面了解下它的属性吧
代理列表:
编辑代理方法
点击按钮
searchBar的范围控件showsScopeBar,官方学名叫Scope Buttons。
首先就要设置这个属性:
self.searchBar.showsScopeBar = YES;
然后要给他添加按钮。比如说,这样:self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"BOY",@"GIRL",@"ALL",nil];
还有一个很重要的事情就是我们要实现这个代理UISearchBarDelegate里的这个方法searchBar:selectedScopeButtonIndexDidChange:。告诉表格,你选择的范围是啥。
还有要是设置默认选择哪个按钮的话,要设置这个属性,像这样就是默认选中第1个啦。
self.searchBar.selectedScopeButtonIndex = 0;
属性 | 作用 |
UIBarStyle barStyle | 控件的样式 |
id<UISearchBarDelegate> delegate | 设置控件的委托 |
NSString *text | 控件上面的显示的文字 |
NSString *prompt | 显示在顶部的单行文字,通常作为一个提示行 |
NSString *placeholder | 半透明的提示文字,输入搜索内容消失 |
BOOL showsBookmarkButton | 是否在控件的右端显示一个书的按钮(没有文字的时候) |
BOOL showsCancelButton | 是否显示cancel按钮 |
BOOL showsSearchResultsButton | 是否在控件的右端显示搜索结果按钮(没有文字的时候) |
BOOL searchResultsButtonSelected | 搜索结果按钮是否被选中 |
UIColor *tintColor | bar的颜色(具有渐变效果) |
BOOL translucent | 指定控件是否会有透视效果 |
UITextAutocapitalizationType autocapitalizationType | 设置在什么的情况下自动大写 |
UITextAutocorrectionType autocorrectionType | 对于文本对象自动校正风格 |
UIKeyboardType keyboardType | 键盘的样式 |
NSArray *scopeButtonTitles | 搜索栏下部的选择栏,数组里面的内容是按钮的标题 |
NSInteger selectedScopeButtonIndex | 搜索栏下部的选择栏按钮的个数 |
BOOL showsScopeBar | 控制搜索栏下部的选择栏是否显示出来 |
编辑代理方法
– searchBar:textDidChange:
– searchBar:shouldChangeTextInRange:replacementText:
– searchBarShouldBeginEditing:
– searchBarTextDidBeginEditing:
– searchBarShouldEndEditing:
– searchBarTextDidEndEditing:
点击按钮
– searchBarBookmarkButtonClicked:
– searchBarCancelButtonClicked:
– searchBarSearchButtonClicked:
– searchBarResultsListButtonClicked:
范围代理
– searchBar:selectedScopeButtonIndexDidChange:
searchBar的范围控件showsScopeBar,官方学名叫Scope Buttons。
首先就要设置这个属性:
self.searchBar.showsScopeBar = YES;
然后要给他添加按钮。比如说,这样:self.searchBar.scopeButtonTitles = [NSArray arrayWithObjects:@"BOY",@"GIRL",@"ALL",nil];
还有一个很重要的事情就是我们要实现这个代理UISearchBarDelegate里的这个方法searchBar:selectedScopeButtonIndexDidChange:。告诉表格,你选择的范围是啥。
还有要是设置默认选择哪个按钮的话,要设置这个属性,像这样就是默认选中第1个啦。
self.searchBar.selectedScopeButtonIndex = 0;
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { NSLog(@"shouldReloadTableForSearchString: %@", searchString); if ((controller.searchBar.selectedScopeButtonIndex != 0) || // 第一个search条件 (searchString && [searchString length])) { [self maybeBeginSearch]; return NO; } else { self.currentResult = nil; return YES; } } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption { NSLog(@"shouldReloadTableforSearchScope: %d", searchOption); if ((searchOption != 0) || (controller.searchBar.text && [controller.searchBar.text length])) { [self maybeBeginSearch]; return NO; } else { self.currentResult = nil; return YES; } } - (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView { // make the activity indicator a sibling of the tableView, so that it can // be displayed on top of it [[tableView superview] addSubview:_activityView]; } - (void)maybeBeginSearch { // cancel any existing timer if (_searchTimer) { NSLog(@"Cancelling existing timer"); [_searchTimer invalidate]; [_searchTimer release]; } // 创建一个timer _searchTimer = [[NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(beginTimerSearch:) userInfo:nil repeats:NO] retain]; } - (void)beginTimerSearch:(NSTimer*)timer { if (timer == _searchTimer) { [_searchTimer invalidate]; [_searchTimer release]; _searchTimer = nil; [self beginSearch]; } } - (void)beginSearch { NSLog(@"Begin search for %@ with scope %d", self.searchDisplayController.searchBar.text, self.searchDisplayController.searchBar.selectedScopeButtonIndex); // in case one is running already [self.currentRequest cancel]; self.currentRequest = nil; NSInteger scopeIndex = self.searchDisplayController.searchBar.selectedScopeButtonIndex; if (scopeIndex == 0) { NSString* searchString = self.searchDisplayController.searchBar.text; if (searchString && [searchString length]) { _activityView.hidden = NO; if ([searchString length]>5 && ![searchString hasSuffix:@"*"]) searchString = [NSString stringWithFormat:@"%@*", searchString]; self.currentRequest = [[FreebaseSession session] search:searchString name:@"suggest" delegate:self didFinishSelector:@selector(searchFinished:) options:[NSDictionary dictionaryWithObjectsAndKeys: @"/common/topic", @"type", nil]]; } else NSLog(@"No search string: %@", searchString); } else { [self beginGeosearch]; } } - (void)beginGeosearch { NSLog(@"beginGeosearch"); _activityLabel.text = @"Locating..."; _activityView.hidden = NO; // this is what I want to do: // self.searchDisplayController.searchResultsTableView.hidden = NO; // this is moronic, but it makes the table display :( NSString* searchString; if (![self.searchDisplayController.searchBar.text length]) self.searchDisplayController.searchBar.text = @" "; else searchString = self.searchDisplayController.searchBar.text; if (!_awaitingLocation) { NSLog(@"Awaiting location, so queing up a search"); _awaitingLocationForSearch = YES; _awaitingLocation = YES; [_locationManager startUpdatingLocation]; } else if (!_currentLocation) { NSLog(@"Not awaiting, but still missing _currentLocation"); // we're awaiting a location, but haven't yet started searching _awaitingLocationForSearch = YES; } else { NSLog(@"Kicking off a geosearch..."); _activityLabel.text = @"Loading..."; _awaitingLocationForSearch = NO; // ok, we have a location, lets search! CLLocationDegrees latitude = _currentLocation.coordinate.latitude; CLLocationDegrees longtitude = _currentLocation.coordinate.longitude; NSDictionary* geoJsonLocation = [NSDictionary dictionaryWithObjectsAndKeys: @"Point", @"type", [NSArray arrayWithObjects: [NSNumber numberWithDouble:longtitude], [NSNumber numberWithDouble:latitude], nil], @"coordinates", nil]; NSString* locationString = [geoJsonLocation JSONRepresentation]; NSArray *mql_output = [NSArray arrayWithObject: [NSDictionary dictionaryWithObjectsAndKeys: [NSNull null], @"id", [NSNull null], @"name", [NSArray arrayWithObject: [NSDictionary dictionaryWithObjectsAndKeys: [NSNull null], @"id", [NSNull null], @"name", [NSNumber numberWithBool:YES], @"optional", nil]], @"type", nil]]; NSString *mql_output_string = [[mql_output JSONRepresentation] retain]; //[{"type": {"optional": "forbidden", // "id|=": ["/location/country", "/location/us_state", "/location/continent", "/location/us_county"]}}] NSString* distance = [NSString stringWithFormat:@"%f", DISTANCES[self.searchDisplayController.searchBar.selectedScopeButtonIndex]]; NSString *searchString = [self.searchDisplayController.searchBar.text stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]; if (searchString && [searchString length]) { NSString *geo_filter = [[NSDictionary dictionaryWithObjectsAndKeys: distance, @"within", locationString, @"location", @"relevance", @"order_by", @"/common/topic", @"type", @"point", @"geometry_type", nil] JSONRepresentation]; NSMutableDictionary* options = [NSMutableDictionary dictionaryWithObjectsAndKeys: geo_filter, @"geo_filter", @"/common/topic", @"type", nil]; if (self.mqlFilter) [options setObject:self.mqlFilter forKey:@"mql_filter"]; NSLog(@"Search with geo_filter for %@ using %@", searchString, options); if ([searchString length]>5 && ![searchString hasSuffix:@"*"]) searchString = [NSString stringWithFormat:@"%@*", searchString]; self.currentRequest = [[FreebaseSession session] search:searchString name:@"geo_relevance" delegate:self didFinishSelector:@selector(searchFinished:) options:options]; } else { NSMutableDictionary* options = [NSMutableDictionary dictionaryWithObjectsAndKeys: distance, @"within", @"relevance", @"order_by", mql_output_string, @"mql_output", @"/common/topic", @"type", @"point", @"geometry_type", nil]; if (self.mqlFilter) [options setObject:self.mqlFilter forKey:@"mql_filter"]; NSLog(@"Searching geo-only"); self.currentRequest = [[FreebaseSession session] geosearch:locationString name:@"suggest" delegate:self didFinishSelector:@selector(geoSearchFinished:) options:options]; } [mql_output_string release]; } } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { self.currentLocation = newLocation; NSLog(@"New location! %@", [newLocation description]); if (_awaitingLocationForSearch) { _awaitingLocationForSearch = NO; [self beginGeosearch]; } else { // ok, we can simply stop at this point - // it means we've gotten a second location marker, // possibly more accurate than before - no sense in // burning the battery. We don't set _awaitingLocation now, // because the one we've got is good enough NSLog(@"Got a second location, that's good enough for now."); [manager stopUpdatingLocation]; } } - (void)searchFinished:(id)result { NSLog(@"Search complete, %d items", [result count]); self.currentResult = result; _activityView.hidden = YES; [self.searchDisplayController.searchResultsTableView reloadData]; } - (void)geoSearchFinished:(NSDictionary*)result { self.currentResult = [result valueForKeyPath:@"features.properties"]; NSLog(@"Geosearch complete, %d items", [self.currentResult count]); _activityView.hidden = YES; [self.searchDisplayController.searchResultsTableView reloadData]; } - (void)errorDidOccur:(id)result name:(NSString*)name { NSLog(@"oops...search error: %@", result); _activityView.hidden = YES; self.currentResult = [NSArray arrayWithObject: [NSDictionary dictionaryWithObjectsAndKeys: [NSNull null], @"id", [NSArray array], @"type", [NSString stringWithFormat:@"Error: %@", result], @"name", nil]]; [self.searchDisplayController.searchResultsTableView reloadData]; } /* - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } */ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.searchDisplayController setActive:YES animated:YES]; [self.searchDisplayController.searchBar becomeFirstResponder]; } /* - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } */ /* - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } */
相关文章推荐
- UIImagePickerController 介绍
- UIStackView
- stringbuffer与stringbuilder的区别?
- OUI-10133:登台区无效
- UE4 含源码插件合集
- LINQ中AsEnumerable与AsQueryable的区别
- 用UE4源码工作之 常用链接合集
- 读视频文件和运动物体检测cvCaptureFromCAM cvQueryFrame
- druid的安装
- compileSdkVersion与buildToolsVersion
- ueditor div style被过滤 解决办法
- 《iOS Human Interface Guidelines》——Info Button
- requirejs 小结
- UISplitViewController - 分割视图控制器
- poj-2533-Longest Ordered Subsequence
- 《iOS Human Interface Guidelines》——Detail Disclosure Button
- 新安装的mysql,启动时候出现错误 The server quit without updating pid file
- 详解iOS App开发中改变UIButton内部控件的基本方法
- UINavigationController、UINavigationBar及navigationItem关系探讨
- .NET跨平台之Sake和KoreBuild