UISearchBar的属性和showsScopeBar

来源:互联网 发布:小学语文课文朗读软件 编辑:程序博客网 时间:2024/06/05 07:00

昨天研究了UISearchBar,今天遇到了showsScopeBar问题, 还是继续说一下UISearchBar 吧

属性
作用
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];}*/

原创粉丝点击