代码改变世界

UISearchBar的属性和showsScopeBar

2012-04-27 17:07  java环境变量  阅读(266)  评论(0编辑  收藏  举报


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

//去掉搜索栏四周的颜色

    [[UISearchBar.subviewsobjectAtIndex:0]removeFromSuperview];


属性
作用
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的范围控件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];
}
*/