我试图找到一个看似明显问题但没有运气的解决方案。
我使用下面的方法从我的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,我想我应该把它称为父母,但对于我的生活,我无法弄清楚如何做到这一点!
提前感谢您的帮助。
答案 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];
}