2016-05-03 6 views
4

HI alle ich arbeite an GMSAutocompleteViewController in meiner App. Ich habe ein uitextfield in meiner Ansicht Controller, wenn ich Textfeld für die Suche nach einem Ort mit Google API, eine neue Ansicht geöffnet ist, die von Google betrieben wird. Schau dir bitte meinen Code an.So wenden Sie eine benutzerdefinierte Suche auf uitextfield für die Google Places-Suche mithilfe des View-Controllers gmsAutocomplete an.

- (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]; 
    } 

ich will nicht für die Suche nach einer anderen Ansicht auf Textfeld tapp bewegen. ist es möglich, dass ich Orte nur aus dem Textfeld suchen kann?

Scrren of my view controller

, wenn ich auf dem Zieltextfeld wird eine neue Ansicht klicken erscheint für die Suche, aber ich brauche nur bitte auf dem Bildschirm nach tapp dem Textfeld von Textfeld suchen.

This screen after click of textfield

+0

Gibt es irgendeine Möglichkeit, diese Aufgabe zu erledigen, oder ich habe immer nur powered by google verwendet? –

+0

Hallo ist es gelöst? –

Antwort

3

Es klingt wie, was Sie nach den Autocomplete-Ergebnisse in einer Tabelle unmittelbar unterhalb dem Textfeld angezeigt werden, wenn das Textfeld aktiv ist (dh etwas ähnliches wie this).

Sie können dies tun, indem Sie eine UITableView erstellen, die Sie in Ihrer Benutzeroberfläche an der richtigen Stelle anzeigen. Erstellen Sie statt GMSAutocompleteViewControllerGMSAutocompleteTableDataSource, und legen Sie es als den Delegaten und die Datenquelle des UITableView fest. Zum Beispiel:

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

Wenn der Text ändert Textfeld, rufen sourceTextHasChanged auf den Tisch Datenquelle.

[_tableDataSource sourceTextHasChanged:textField.text]; 

Schließlich haben die Eltern-View-Controller das GMSAutocompleteTableDataSourceDelegate Protokoll

Es gibt einige Beispiele-Code in der Beispielanwendung in der Google CocoaPod enthaltenen implementieren, die zu dem, was Sie wollen nah ist. Suchen Sie im heruntergeladenen Pods-Verzeichnis nach SDKDemoAutocompleteWithTextFieldController.m.

+0

kannst du mir bitte im selben Szenario helfen? @AndrewR –

1

Ich habe diesen Code verwendet, um dasselbe Verhalten zu erreichen, das Sie verlangen.

-(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; 

}

Und auf Tableview didSelect Methode Gebrauch folgende

- (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]; 
} 

nach Tabelle neu laden, verwenden Sie diese in cellForRowAtIndexPath ausgewählten Ortsnamen zu aktualisieren.

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

Hoffe das hilft Ihnen. :)

+0

Bro, ich habe ein Textfeld und darunter ist eine Tabellenansicht, wenn Benutzer tippen Sie auf das Textfeld zeigen Sie die relevanten Orte, bro ich bekomme nicht, wie dies zu tun, können Sie mir dabei helfen? Ich versuche es das erste Mal und ich habe viele Probleme. @Nij –

+0

kannst du mir dabei helfen? @Nij –

+0

überprüfen Sie Delegiertenmethode von Textfeld und zeigen Sie Ihre Tabellenansicht entsprechend an. – Nij

0

Dies ist meine Antwort basierend auf @ Nij. Dies wird Ihnen die volle Zufriedenheit geben ...

#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

Verwenden Sie die Hauptwarteschlange zum erneuten Laden der Daten der Tabellenansicht, dispatch_async (dispatch_get_main_queue(),^{ [_tbl_vw1 reloadData]; }); – iOS

+0

Dieser obige Code zeigt nur zwei Stellen an, wenn Sie mehr als zwei Stellen anzeigen wollen ... Ändern Sie json dic count wie folgt .... für (int i = 0; i <[[jsondic objectForKey: @ "Vorhersagen "] count]; i ++) { NSString * str1 = [[[jsondic objectForKey: @" Vorhersagen "] objectAtIndex: i] objectForKey: @" description "]; [SuchArray addObject: str1]; } – iOS

Verwandte Themen