2014-01-16 2 views
0

В настоящее время я пытаюсь передать название города, полученное CLGeocoder, в UILabel другого класса. Сначала CLGecoder классаПередача названия города CLGeocoder новому классу UILabel

FindLocation.h

@property (nonatomic, strong) NSString *cityName; 

FindLocation.m - внутри метода (пустоте) locationManager: (CLLocationManager *) менеджер ...

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
if (self.isFirstUpdate) { 
    self.isFirstUpdate = NO; 
    return; 
} 

CLLocation *location = [locations lastObject]; 

if (location.horizontalAccuracy > 0) { 
    self.currentLocation = location;} 

CLGeocoder *fgeo = [[CLGeocoder alloc] init]; 

// Reverse Geocode a CLLocation to a CLPlacemark 
[fgeo reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError 
*error){ 
    NSLog(@"%@", location); 

       // Make sure the geocoder did not produce an error 
       // before continuing 
       if(!error){ 
        // Iterate through all of the placemarks returned 
        // and output them to the console 

        for(CLPlacemark *placemark in placemarks){ 
         NSLog(@"%@",[placemark description]); 
         self.cityName = [placemark locality]; 
         NSLog(@"city is %@",cityName); } 

        [self.locationManager stopUpdatingLocation]; 
        [self.delegate findLocationDidGeocodeCityName:self.cityName]; 
       } else { 
        // Our geocoder had an error, output a message 
        // to the console 
        NSLog(@"There was a reverse geocoding error\n%@", 
         [error localizedDescription]); 

Далее в моем FirstViewController это выглядит следующим образом:

FindLocation *cityname = [[FindLocation alloc] init]; 
    [cityname cityName]; 
    [self.cityLabel setText:(cityname.cityName)]; 
    NSLog(@"CityName is...%@", cityname.cityName); //Log shows CityName is...(null) 

Я не знаю, что здесь не так. Поскольку город найден, в последней части кода должно быть что-то не так, но я не знаю, что. Неправильно ли передается NSString - cityName?

+0

Я бы установил точку останова в начале вашего locationManager: didUpdateLocations: метод и шаг за шагом. Интересно, обновляется ли он только один раз и поэтому возвращается после установки 'self.isFirstUpdate = NO'. Или, может быть, просто закомментируйте инструкцию 'return ;' и посмотрите, работает ли она. – atticus

+0

Да, сейчас его зовут, но все равно не повезло с печатью на этикетке города – Pierre

+0

Может быть, глупый вопрос, но уверены ли вы, что cityLabel подключен к интерфейсу Builder? – atticus

ответ

0

Я думаю, проблема в том, что процесс геокодирования не является мгновенным. Вы создаете экземпляр FindLocation, а затем сразу же пытаетесь получить доступ к cityName. Однако даже если предположить, что ваш метод init инициирует обновление местоположения, геокодер займет немного времени, чтобы перейти на сервер и получить ответ. Кроме того, менеджер местоположений не будет немедленно возвращать местоположение, и, поскольку похоже, что это то, что начинается с геокодера, вам придется подождать еще немного для этого.

Одним из решений здесь было бы реализовать протокол делегатов на FindLocation, чтобы он мог уведомить FirstViewController, когда геокодирование завершено. Что-то вроде этого:

FindLocation.h

#import <UIKit/UIKit.h> 

@class FindLocation; 
@protocol FindLocationDelegate <NSObject> 
- (void)findLocationDidGeocodeCityName:(NSString *)cityName; 
@end 

@interface FindLocation : NSObject 

@property (weak, nonatomic) id<FindLocationDelegate> delegate; 

@end 

, а затем в вашем CLGeocoder completionHandler после извлечения CITYNAME:

[self.delegate findLocationDidGeocodeCityName:self.cityName]; 

Теперь в FirstviewController.h укажите, что соответствует протоколу FindLocationDelegate :

@interface FirstViewController : UIViewController <FindLocationDelegate> 

В вашем FirstViewCont roller.m установите делегат так:

FindLocation *cityName = [[FindLocation alloc] init]; 
cityName.delegate = self; 

, а затем и в FirstViewController, реализовать метод делегата:

#pragma mark - FindLocation Delegate 

- (void)findLocationDidGeocodeCityName:(NSString *)cityName 
{ 
    [self.cityLabel setText:cityName]; 
} 

Есть другие способы сделать это, как хорошо, но ключ вам нужно подождать, пока завершится завершение работы Handler, а затем уведомить любые другие заинтересованные объекты о том, что было возвращено.

+0

Часть, где я установил делегат, вызывает ошибку: присвоение id из несовместимого типа сильным – Pierre

+0

Где вы звоните этому коду? Можете ли вы опубликовать метод для меня, чтобы посмотреть? – atticus

+0

Я вызываю этот код в viewDidLoad. Какой метод вы имеете в виду? – Pierre

Смежные вопросы