NSObject中的CLLocationManager

时间:2014-07-12 21:58:09

标签: objective-c subclass cllocationmanager nsobject

我试图找到一个看似明显问题但没有运气的解决方案。

我使用下面的方法从我的ViewController调用NSObject,它启动CLLocationManager并返回当前位置。

locationObject *location = [[locationObject alloc] init];
[location updateLocation];

然而,我不能做的是将数据传递回视图控制器而不会导致问题。我试过用...

ViewController *controller = = [[ViewController alloc] init];
[controller updateContent:lat longitude:lng];

这会通过ViewLogtroller中的updateContent方法中的NSLog打印出所有内容,但它不会更新任何标签或调用任何方法。

我想简单地更新一个UILabel,但没有任何反应。我确信这与我只调用一个方法而不是整个视图控制器的事实有关。

我认为我错误地调用了ViewController,我想我应该把它称为父母,但对于我的生活,我无法弄清楚如何做到这一点!

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

所以你有一个UIViewController - 让我们称它为' A'您已创建并且标签为子视图。然后你还有一个我猜测的对象是你的CLLocationManager委托。您正在做的是创建一个全新的UIViewController - ' B'并告诉它更新位置,但您没有引用原始的' A'视图控制器,这就是日志语句出现以记录正确信息的原因,但A'

中没有任何变化。

有几种方法可以解决这个问题,但我认为最容易掌握的是使用NSNotificationCenter向您的应用广播一条消息说“嘿,我已经有了新的位置!”用它做点什么!'。第二步是允许外部对象引用此位置,可能是通过向您的位置对象添加属性。我会做以下事情,看看它是否有效:

在您的位置对象的.h文件中添加如下内容:

@property (nonatomic, retain) CLLocation *currentLocation;

当您的位置对象从CLLocationManager收到更新的位置时,我会这样做:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
     // get the most recent object from the CLLocationManager and set it as your currentLocation
     self.currentLocation = [locations lastObject];

     // broadcast to the application that you have a new location
     [[NSNotificationCenter defaultCenter] @"GotNewLocation" object:nil userInfo:nil];
}

然后,在视图控制器中,将其添加到init或viewDidLoad方法的某处:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNewLocation) name:@"GotNewLocation" object:nil];

然后,在handleNewLocation函数中处理你需要做的事情:

- (void)handleNewLocation {
    // get the current location from the location object and use its coordinate to do what you need
    CLLocation *currentLocation = yourLocationObject.currentLocation;
    [self updateContent:currentLocation.coordinate.latitude longitude:currentLocation.coordinate.longitude];
}