我正在监视iBeacons和iOS中的圆形区域。如果我试图将它们分开定义:
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region {}
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLBeaconRegion *)region {}这显然是一个重复的声明错误。This SO answer很好地指示了如何区分哪个区域触发。为了达到这个目的,我正在努力弄清楚如何定义一个公共区域退出事件,每个人都会对此感到满意。如果我使用CLRegion将它们组合在一起,就会出现各种警告:
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
if (region.class == CLCircularRegion.class) {
CLLocationCoordinate2D coordinate = [region center]; // Deprecation warning, use CLCircularRegion instead
// etc...
}
if (region.class == CLBeaconRegion.class) {
[locationManager stopRangingBeaconsInRegion:region]; // Incompatible pointer types warning
// etc...
}
}我最初使用didDetermineState定义了信标处理,但是它会导致一些额外的事件。例如,CLRegionStateOutside最初为所有受监视的区域触发,这是完全合适的,但我不需要知道这一点,所以我宁愿使用didExitRegion。
是否有适当的方法来编写一个干净的组合didExitRegion,这样它就可以处理循环区域和信标区域,而不会出现错误或警告?
发布于 2018-04-08 08:54:48
方法签名由CLLocationManagerDelegate协议定义,其内容如下:
- (void)locationManager:(CLLocationManager *)manager
didExitRegion:(CLRegion *)region;如果要调用该方法,则必须使用此签名。
通过检查所传递区域的类型,您处于正确的轨道上。您缺少的部分是使用强制转换将region分配给相应子类的变量,以便在尝试执行子类特定的事情时不会收到警告/错误。
注意,使用isKindOfClass:也比直接比较类更安全。如果对象是指定类的实例或指定类的子类,则isKindOfClass返回YES。因此,如果苹果进行了一些内部更改,并开始向您发送CLNewBeaconRegion对象(这是CLBeaconRegion的子类),那么您的代码仍然可以工作。
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
{
if ([region isKindOfClass:CLCircularRegion.class]) {
CLCircularRegion *circularRegion = (CLCircularRegion *)region;
CLLocationCoordinate2D coordinate = circularRegion.center;
// etc...
} else if ([region isKindOfClass:CLBeaconRegion.class]) {
CLBeaconRegion *beaconRegion = (CLBeaconRegion *)region;
[locationManager stopRangingBeaconsInRegion:beaconRegion];
// etc...
}
}https://stackoverflow.com/questions/49715625
复制相似问题