2014-01-20 2 views
1

Я пытаюсь передать местонахождение метки из CLGeocoder в другой класс UILabel с именем cityLabel. Класс с CLGeocoder с именем WXManager и mainViewController с именем WXController. Я старался изо всех сил, чтобы он работал, но я просто не могу получить название города, переданное в cityLabel.Передача имени города CLGeocoder с помощью протокола делегата

WXManager.h

@class WXManager; 
@protocol WXManagerDelegate <NSObject> 

- (void)WXManagerDidGeocodeCityName:(NSString *)cityName; 

@end 

@interface WXManager : NSObject <CLLocationManagerDelegate> 
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations; 
@end 

WXManager.m

- (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; 
    [self.locationManager stopUpdatingLocation];} 


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

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

       if(!error){ 

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

       } else { 
        NSLog(@"There was a reverse geocoding error\n%@", 
         [error localizedDescription]); 
       } 
      } 
]; 
} 

WXController.h

@interface WXController : UIViewController 
<WXManagerDelegate> 

- (void)WXManagerDidGeocodeCityName:(NSString *)cityName; 

@end 

И наконец, в WXController.m, где эта проблема, кажется, мой метод WXManagerDidGeocodeCityName не будет вызван. И я не знаю, что случилось. Кто-нибудь знает, как заставить этот метод получить вызов?

WXManager *cityName = [[WXManager alloc] init]; 
cityName.customDelegate = self; 

#pragma mark - Custom Delegate Method 

- (void)WXManagerDidGeocodeCityName:(NSString *)cityName 
{ 

[self.cityLabel setText:cityName]; 
NSLog(@"cityName is %@", cityName); 
NSLog(@"DidGetCalled"); 
} 

Журнал не называется, поэтому где-то там что-то не хватает.

+0

, как это определено customDelegate –

+0

о пропущенных, что @property (слабый, неатомической) идентификатор customDelegate; – Pierre

+0

ты держишься за название города? иначе он не будет сохранен, и он уйдет –

ответ

1

в WXManager.m вам необходимо инициализировать CLLocationManager:

self.locationManager = [[CLLocationManager alloc] init]; 

self.locationManager.delegate = self; 
[self.locationManager startUpdatingLocation]; 

и все будет работать хорошо

+0

Я не знаю думаю, что это потому, что эта часть работает нормально. Значок NSLog из метки указывает правильный город. – Pierre

1

Я собираюсь предположить, что cityName является weak, или имеет собственный сеттер/геттер, который очищает/игнорирует правильное значение.

Редактировать разъяснений:

Я говорил о своем cityName здесь:

WXManager *cityName = [[WXManager alloc] init]; 
cityName.customDelegate = self; 

Я предполагаю, что это будет присвоено некоторое свойство self.cityName позже. Если вы этого не сделаете, ваш self.customDelegate станет nil к тому времени, когда будет выполняться обработчик завершения.

+0

он настроен на сильный, неатомный – Pierre

+0

Я обновил свой ответ, чтобы уточнить, о каком «cityName» я говорил. –

+0

Хмм, я до сих пор не понимаю. Выполняется обработчик завершения, предполагается отправить имя города в WXController, где я установил делегат cityName. Где бы вы предложили положить его? – Pierre

1

Метод не называется? Или переменное имя города равно нулю?

Если во-первых - поиск вашего делегата может быть равным нулю. Если второй - CLGeocoder работает некорректно.

Обычно отладчик прогуливается. Посмотрите на переменные. Быстро все поймите.

+0

CLGeocoder работает, он возвращает название города. Метод WXManagerDidGeocodeCityName: не вызывает вызов вообще, поэтому он ничего не возвращает. – Pierre

+0

Пьер, ищите свой заказ. Может быть, он равен нулю. Вы знаете, как использовать отладчик? Поместите точку останова в том месте, где метод называется делегатом. Печать customDelegate. Вот он: po self.customDelegate – Aliaksandr

2

Попробуйте это:

WXManager.h

@class WXManager; 
@protocol WXManagerDelegate <NSObject> 

- (void)WXManagerDidGeocodeCityName:(NSString *)cityName; 

@end 

@interface WXManager : NSObject <CLLocationManagerDelegate> { 
id <WXManagerDelegate> customDelegate; 
} 

@property (retain)id customDelegate; 

@end 

WXController.h

@interface WXController : UIViewController <WXManagerDelegate> 

//- (void)WXManagerDidGeocodeCityName:(NSString *)cityName; 

@end 
0

в WXManager.m вам необходимо инициализировать CLLocationManager:

self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; [self.locationManager startUpdatingLocation];

и все будет работать хорошо

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