扩展现有协议以修改 Objective C 中的委托参数

Posted

技术标签:

【中文标题】扩展现有协议以修改 Objective C 中的委托参数【英文标题】:Extend existing protocol in order to modify delegates parameters in Objective C 【发布时间】:2014-06-02 14:53:27 【问题描述】:

我不知道这是否可能。

有没有办法扩展 CLLocationManager 及其协议 (CLLLocationManagerDelegate) 以便在其委托 didRangeBeacon 中接收自定义 CLBeaconRegion(从 CLBeaconRegion 扩展的类)并且信标数组包含而不是常规 CLBeacon 实例,一个来自另一个的实例 一个从 CLBeacon 扩展的类。

现在我有一个在 didRangeBeacon 委托中的实现,它准备我的自定义 CLBeaconRegion 和 CLBeacon 类的实例,并调用我在 .h 文件中定义的协议的自定义 didRangeBeacon 方法(看起来非常接近常规CLLocationManagerDelegate 协议在方法和属性方面)

也许我没有解释我自己。这是我所拥有的:

在我的 customDelegate .h 中,我有:

@class MyCustomManager;

    @protocol MyCustomManagerDelegate <CLLocationManagerDelegate>

    @optional
    - (void)myManager:(MyCustomManager*)myManager didFoundBeacon:(MyCustomBeacon *)beacon inRegion:(MyCustomBeaconRegion *)region;
    - (void)myManager:(MyCustomManager*)myManager didLostBeacon:(MyCustomBeacon *)beacon inRegion:(MyCustomBeaconRegion *)region;
    - (void)myManager:(MyCustomManager*)myManager didEnterRegion:(MyCustomBeaconRegion *)region;
    - (void)myManager:(MyCustomManager*)myManager didExitRegion:(MyCustomBeaconRegion *)region;
    - (void)myManager:(MyCustomManager*)myManager didRangeBeacon:(NSArray *)beacons inRegion:(MyCustomBeaconRegion *)region;

    @end

@interface MyCustomManager : NSObject  <CLLocationManagerDelegate>

    @property (weak, nonatomic) id<MyCustomManagerDelegate> delegate;

@end

然后在我的 .m 中我有:

@implementation MyCustomManager

    -(void) locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(MyCustomBeaconRegion *)region
    //my code goes here
    

@end

如果我调试我的应用程序并使用断点检查 didRangeBeacons 内部,我仍然会收到 CLBeaconRegion 而不是 MyCustomBeaconRegion。在调试控制台中检查第一个信标属性,仍然是 CLBeacon 而不是 MyCustomBeacon,但是我看到列出了我的自定义信标类属性(首先出现的是 CLBeacon,然后是我的扩展类属性)

我知道我肯定做错了什么,但我不知道在哪里。我已经多次使用继承,但没有使用协议/委托和这个 CLLocationManager。我不知道我所问的是否可能。

我想知道是否可以覆盖默认委托方法,以便使用我的自定义类而不是默认协议参数类来调用它们。

【问题讨论】:

【参考方案1】:

可能是不可能的。系统框架不开放修改。

【讨论】:

好吧,这就是我的想法,但谷歌搜索,我误解了一些概念。无论如何,谢谢,我想我今天要疯了:) 现在,您可能可以创建自己的位置管理器,其中包含系统位置管理器的实例。您的位置管理器将成为系统位置管理器的代表,并将从系统框架中获取信标区域,将它们转换为您的自定义子类,然后将它们转发给 IT 代表。 你好,邓肯,确实,这就是我所做的。我只是在重构我的代码,在想太多之后我感到困惑哈哈哈:)

以上是关于扩展现有协议以修改 Objective C 中的委托参数的主要内容,如果未能解决你的问题,请参考以下文章

是否可以创建在 Objective C 中手动开发的核心数据实体的快速扩展?

Objective-C 2.0 基础要点归纳

Objective-C 类型的 Swift 2 协议扩展和一致性

从 Objective C 调用 Swift 中定义的 NSString 扩展

如何在objective c框架中使用swift扩展

objective c, protocol