首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为CLCircularRegion和CLBeaconRegion定义组合的入口/退出事件?

如何为CLCircularRegion和CLBeaconRegion定义组合的入口/退出事件?
EN

Stack Overflow用户
提问于 2018-04-08 07:44:27
回答 1查看 43关注 0票数 0

我正在监视iBeacons和iOS中的圆形区域。如果我试图将它们分开定义:

代码语言:javascript
复制
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLCircularRegion *)region {}
- (void) locationManager:(CLLocationManager *)manager didExitRegion:(CLBeaconRegion *)region {}

这显然是一个重复的声明错误。This SO answer很好地指示了如何区分哪个区域触发。为了达到这个目的,我正在努力弄清楚如何定义一个公共区域退出事件,每个人都会对此感到满意。如果我使用CLRegion将它们组合在一起,就会出现各种警告:

代码语言:javascript
复制
- (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,这样它就可以处理循环区域和信标区域,而不会出现错误或警告?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-08 08:54:48

方法签名由CLLocationManagerDelegate协议定义,其内容如下:

代码语言:javascript
复制
- (void)locationManager:(CLLocationManager *)manager 
     didExitRegion:(CLRegion *)region;

如果要调用该方法,则必须使用此签名。

通过检查所传递区域的类型,您处于正确的轨道上。您缺少的部分是使用强制转换将region分配给相应子类的变量,以便在尝试执行子类特定的事情时不会收到警告/错误。

注意,使用isKindOfClass:也比直接比较类更安全。如果对象是指定类的实例或指定类的子类,则isKindOfClass返回YES。因此,如果苹果进行了一些内部更改,并开始向您发送CLNewBeaconRegion对象(这是CLBeaconRegion的子类),那么您的代码仍然可以工作。

代码语言:javascript
复制
- (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...
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49715625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档