2016-05-03 30 views
4

你好我正在GMSAutocompleteViewController在我的应用程序工作。我有一个uitextfield在我的视图控制器时,我tapp textfield搜索使用谷歌API的地方,一个新的视图是开放的,由谷歌供电。请看我的代码。如何在uitextfield上应用自定义搜索,以便使用gmsAutocomplete视图控制器进行搜索。

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 



tappedTextField = textField; 
     GMSAutocompleteViewController *acController = [[GMSAutocompleteViewController alloc] init]; 
     acController.delegate = self; 
     [self presentViewController:acController animated:YES completion:nil]; 



    } 


    - (void)viewController:(GMSAutocompleteViewController *)viewController 
    didAutocompleteWithPlace:(GMSPlace *)place { 
// Do something with the selected place. 
NSLog(@"Place name %@", place.name); 
NSLog(@"Place address %@", place.formattedAddress); 
NSLog(@"Place attributions %@", place.attributions.string); 
NSLog(@"lat and log%f", place.coordinate.latitude); 
NSLog(@"lang %f", place.coordinate.longitude); 



    tappedTextField.text = place.name; 



[self dismissViewControllerAnimated:YES completion:nil]; 
} 

    - (void)viewController:(GMSAutocompleteViewController *)viewController 
    didFailAutocompleteWithError:(NSError *)error { 
// TODO: handle the error. 
     NSLog(@"error: %ld", (long)[error code]); 
    [self dismissViewControllerAnimated:YES completion:nil]; 
    } 

    // User canceled the operation. 
- (void)wasCancelled:(GMSAutocompleteViewController *)viewController { 
NSLog(@"Autocomplete was cancelled."); 
[self dismissViewControllerAnimated:YES completion:nil]; 
    } 

我不想要移动到另一种观点认为在文本框TAPP进行搜索。有可能我只能从文本字段中搜索地点吗?

Scrren of my view controller

当我在目的地文本框单击一个新的观点出现了搜索,但我只需要请TAPP文本字段后,屏幕从文本框进行搜索。

This screen after click of textfield

+0

有没有可能做这个任务,或者我总是使用视图由谷歌只提供动力? –

+0

嗨它解决了吗? –

回答

3

这听起来像你追求的是在一个表中立即显示自动完成结果的文本框下方当文本字段处于活动状态(即类似于this的东西)。

您可以通过创建一个UITableView来显示在UI中正确的位置。而不是使用GMSAutocompleteViewController,创建一个GMSAutocompleteTableDataSource并将其设置为UITableView的委托和数据源。例如:

_tableDataSource = [[GMSAutocompleteTableDataSource alloc] init]; 
_tableDataSource.delegate = self; 
tableView.delegate = _tableDataSource; 
tableView.dataSource = _tableDataSource; 

当文本字段文本更改时,请在表数据源上调用sourceTextHasChanged

[_tableDataSource sourceTextHasChanged:textField.text]; 

最后,有父视图控制器实现GMSAutocompleteTableDataSourceDelegate协议

有中所含的GoogleMaps CocoaPod样本应用程序,是接近你想要的一些示例代码。在下载的Pods目录中查找SDKDemoAutocompleteWithTextFieldController.m

+0

你能帮我在同一场景吗? @AndrewR –

1

我用这个代码来实现你所要求的相同行为。

-(void)LoadJson_search{ 
searchArray=[[NSMutableArray alloc]init]; 
NSLog(@"str......%@",strSearch); 

NSString *str1 = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&key=AIzaSyD2NttUhPQ4PKvpju97qpeWj8SYnZtzt0s",strSearch]; 
NSLog(@"%@",strSearch); 
NSURL *url = [NSURL URLWithString:str1]; 

NSData *data = [NSData dataWithContentsOfURL:url]; 
NSError *error=nil; 
if(data.length==0) 
{ 

} 
else 
{ 
    NSDictionary *jsondic= [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

    // NSLog(@"1,,,,%@",jsondic); 
    [searchArray removeAllObjects]; 
    if([[jsondic objectForKey:@"status"]isEqualToString:@"ZERO_RESULTS"]) 
    { 

    } 
    else if([[jsondic objectForKey:@"status"]isEqualToString:@"INVALID_REQUEST"]) 
    { 
    } 
    else 
    { 
     for(int i=0;i<[jsondic.allKeys count];i++) 
     { 
      //['predictions'][0]['description'] 
      NSString *str1=[[[jsondic objectForKey:@"predictions"] objectAtIndex:i] objectForKey:@"description"]; 
      [searchArray addObject:str1]; 
     } 
     tbl_vw1.hidden=FALSE; 
    } 
    if (searchArray.count == 0) { 
     tbl_vw1.hidden = TRUE; 
    }else{ 
     [tbl_vw1 reloadData]; 
    } 
} 

}

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;{ 
if (textField.tag == 3) { 
    strSearch = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    if([string isEqualToString:@" "]){ 

    }else{ 
     [self LoadJson_search]; 
    } 
} 
return YES; 

}

而上实现代码如下didSelect方法使用以下

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
strSelectedAddress = [searchArray objectAtIndex:indexPath.row]; 
[self.eventDict setObject:strSelectedAddress forKey:@"venue"]; 
// [self geoCodeUsingAddress:str_select_address]; 

tbl_vw1.hidden=TRUE; 
[tbl_vw reloadData]; 
} 

重装表后,用这的cellForRowAtIndexPath更新选定的地名。

cell.txt.text = [self.eventDict objectForKey:@"venue"]; 

希望这可以帮助你。 :)

+0

兄弟,我有一个textfield,在它下面是一个tableview,当用户点击文本框它显示相关的地方,兄弟我没有得到如何做到这一点,你可以帮助我吗?我第一次尝试,面临很多问题。 @Nij –

+0

你能帮我吗? @Nij –

+0

检查文本字段的委托方法并显示你的tableview。 – Nij

0

这是我基于@ Nij的答案。这会让你完全满意......

#import "ViewController.h" 
#import <GooglePlaces/GooglePlaces.h> 

@interface ViewController() <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource> { 

    NSMutableArray *searchArray; 
    NSString *strSearch; 

} 

@property (weak, nonatomic) IBOutlet UITextField *searchTextfeild; 
@property (weak, nonatomic) IBOutlet UITableView *tbl_vw1; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    _searchTextfeild.delegate = self; 
    _tbl_vw1.delegate = self; 
    _tbl_vw1.dataSource = self; 
    _tbl_vw1.hidden = YES; 

    _searchTextfeild.clearButtonMode = UITextFieldViewModeAlways; 

} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)LoadJson_search{ 

    searchArray=[[NSMutableArray alloc]init]; 
    // NSLog(@"str......%@",strSearch); 
    // This API key is from https://developers.google.com/maps/web/ 
    NSString *str1 = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/queryautocomplete/json?input=%@&key=AIzaSyAm7buitimhMgE1dKV2j4_7doULluiiDzU", strSearch]; 
    NSURL *url = [NSURL URLWithString:str1]; 

    NSData *data = [NSData dataWithContentsOfURL:url]; 
    NSError *error=nil; 
    if(data.length==0) 
    { 

    } 
    else 
    { 
     NSDictionary *jsondic= [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

    //   NSLog(@"1,,,,%@",jsondic); 
     [searchArray removeAllObjects]; 
     if([[jsondic objectForKey:@"status"]isEqualToString:@"ZERO_RESULTS"]) 
     { 

     } 
     else if([[jsondic objectForKey:@"status"]isEqualToString:@"INVALID_REQUEST"]) 
     { 
     } 
     else 
     { 
      for(int i=0;i<[jsondic.allKeys count];i++) 
      { 
       NSString *str1=[[[jsondic objectForKey:@"predictions"] objectAtIndex:i] objectForKey:@"description"]; 
       [searchArray addObject:str1]; 
      } 
      _tbl_vw1.hidden = NO; 
    //   NSLog(@"%@", searchArray); 
     } 
     if (searchArray.count == 0) { 
      _tbl_vw1.hidden = YES; 
     }else{ 
      [_tbl_vw1 reloadData]; 
     } 
    } 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;{ 
    if (textField.tag == 3) { 
     strSearch = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
     if([string isEqualToString:@" "]){ 

     }else{ 
      [self LoadJson_search]; 
     } 
    } 
    return YES; 
} 


- (BOOL)textFieldShouldClear:(UITextField *)textField{ 
    _tbl_vw1.hidden = YES; 
    [_tbl_vw1 reloadData]; 

    return YES; 
} 


//TableView delegates 
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return searchArray.count; 
} 


-(UITableViewCell *)tableView:(UITableView*)aTableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath { 

    UITableViewCell *cell = [_tbl_vw1 dequeueReusableCellWithIdentifier:@"cell"]; 
    if(!cell) { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 
// NSLog(@"searchArray ==== %@", searchArray); 
    cell.textLabel.text = [searchArray objectAtIndex:indexPath.row]; 

    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    _searchTextfeild.text = [searchArray objectAtIndex:indexPath.row]; 

    _tbl_vw1.hidden = YES; 
    [_tbl_vw1 reloadData]; 

} 
+0

使用主队列重新载入表视图数据,dispatch_async(dispatch_get_main_queue(),^ { [_tbl_vw1 reloadData]; }); – iOS

+0

这个代码只会显示两个地方,如果你想显示两个以上的地方......改变json的dic计数就像这样... for(int i = 0; i <[[jsondic objectForKey:@“predictions “] count]; i ++) NSString * str1 = [[[jsondic objectForKey:@”predictions“] objectAtIndex:i] objectForKey:@”description“]; [searchArray addObject:str1]; } – iOS

相关问题