我在一个应用程序中有两个CLLocationManage。第一个是监视信标区域,而另一个是监视正常的CLRegion。
A.m中的第一个
// Do any additional setup after loading the view.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
B.m中的第二个
gpsLocationManager = [[CLLocationManager alloc] init];
gpsLocationManager.delegate = self;
我对后者非常肯定,我没有在任何信标区域调用任何startMonitoringForRegion。但是,似乎B中的gpsLocationmanager继续从A中的那个接收enterRegion回调。所以最终我检查传入的区域para类型以使gpsLocationManager不响应来自beacon region enter的任何回调。
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
NSLog(@"%d regions under monitor:", self.gpsLocationManager.monitoredRegions.count);
NSLog(@"%d regions in regionArray:", self.regionArray.count);
NSLog(@"Region type %@:", [region class]);
if(![region isKindOfClass:[CLBeaconRegion class]]){
有什么想法吗?
此致 锤
答案 0 :(得分:2)
CoreLocation
功能是在应用范围内提供的。
这就是常见模式是在CLLocationManager
中初始化AppDelegate
并将其设为CLLocationManagerDelegate
。
如果您需要访问多个CLLocationManager
中的一个UIViewController
,我会将其设为AppDelegate
的属性。然后,如果已经初始化并且可见,则可以将所需的回调转发到UIViewController
。
答案 1 :(得分:1)
当我创建2个类时,我遇到了同样的问题(1个用于地理围栏(CLRegion或CLCircularRegions),2个用于Beacon REgions(CLBeaconRegions)。两个单例类的属性称为lManager(CLLocationManager)。
最初我尝试过这个条件检查
if (manager == self.gpsLocationManager) {
// Do things
}
威尔玛说。它无法正常工作..
在对区域类进行深入调查后,我使用以下条件来变化区域。 EX:
func locationManager(manager: CLLocationManager!, didStartMonitoringForRegion region: CLCircularRegion!) {
if(region.isMemberOfClass(CLCircularRegion)){
// Do things. here
}
}
它为我工作。
干杯:p
答案 2 :(得分:0)
在A.m和B.m中,您可以检查正在响应的locationManager是否是您感兴趣的locationManager,并做出相应的反应。然而,我会尝试坚持使用davidgyoung提到的单个locationManager。
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
{
if (manager == self.gpsLocationManager) {
// do things
}
else {
// this is another location manager which I am not interested in
}
}