【问题标题】:Subclass MKMapView and makes it mapview delegate while still allow other delegate子类 MKMapView 并使其成为 mapview 委托,同时仍允许其他委托
【发布时间】:2013-10-29 04:44:25
【问题描述】:

我有一个设计问题。这是我想要做的:我想将MKMapView 约束到特定区域,同时使其成为想要实际使用地图的视图控制器的抽象。

为了限制地图视图,我很可能希望使用委托方法mapView:regionDidChangeAnimated: 并在该区域超出我的预定区域时收到更改通知并将地图移回。但是,由于我想让它足够通用,我不希望代码在视图控制器中。我想我可能想改为子类 MKMapView。

如果我这样做,我将拥有MKMapView 的子类(例如,ConstraintMapView 类),它也是MKMapView 的代表,并公开将区域约束给该类的任何用户的方法。但是类的用户(比如视图控制器)也希望成为MKMapView 的代表,所以我还想将所有的委托消息转发给视图控制器。

为此,我需要一个委托属性,该属性指向 real 委托(视图控制器),但在我的 ConstriantMapView 中,如果我有这意味着我将覆盖 @987654328 @ 的 setter 和 getter 到委托,事情变得有点复杂,因为在 MKMapView 内部它可以调用 ConstraintMapView 的方法,我会给它视图控制器,但我真的想给它 ConstraintMapView

  1. 有没有办法让这个工作?
  2. 是否有更好的模式可以让控制器免于将视图移回约束区域的细节?

【问题讨论】:

    标签: ios objective-c delegates mkmapview mapkit


    【解决方案1】:

    我在这个项目中做了类似的代理MKMapViewDelegate;看看吧:

    https://github.com/mapbox/mbxmapkit

    【讨论】:

    • 哦,嗨,我也时常在 MapBox 论坛上发帖。事实上,我目前正在尝试将本机 sdk 与 MBTiles 一起使用,因为 iOS7 可以轻松地将地图加载到它上面。所以使用 MBXMapKit 你只是在你的 MKMapView 子类中覆盖 setDelegate 而不是覆盖 getter?您如何确保 MKMapView 想要向其委托发送消息时,它不会直接发送给真正的委托并完全绕过您的MBXMapViewDelegate
    • 我想我开始明白了。很棒的解决方案。
    • 使用NSProxy站在和使用NSObject有什么区别? forwardInvocation:methodSignatureForSelector 似乎也适用于 NSObject?
    【解决方案2】:

    如果你想修改现有类,你可以使用“装饰器设计模式”。这是简要说明。
    http://www.raywenderlich.com/46988/ios-design-patterns
    希望对您有所帮助

    【讨论】:

    • 委托和类别都会遇到我描述的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2014-12-10
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多