菜鸟教程小白 发表于 2022-12-13 09:09:49

iphone - MKMapViewDelegate 派生类和委托(delegate)赋值


                                            <p><p>这可能更像是一个关于 iOS 的 Objective-c 问题,但我已经看到了一些类似于以下的示例代码,我想更好地理解这些代码。</p>

<pre><code>@interface MyMapView : MKMapView &lt;MKMapViewDelegate&gt; {
// ivars specific to derived class
}

@property(nonatomic,assign) id&lt;MKMapViewDelegate&gt; delegate;

@end

@implementation MyMapView
- (id) initWithFrame:(CGRect)frame
{
    self = ;
    if (self)
    {
      // initialize the ivars specific to this class

      // Q1: Why invoke super on this delegate that&#39;s also a property of this class?   
      super.delegate = self;

      zoomLevel = self.visibleMapRect.size.width * self.visibleMapRect.size.height;
    }
    return self;
}
#pragma mark - MKMapViewDelegate methods
// Q2: Why intercept these callbacks, only to invoke the delegate?
- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
    if( )
    {
      ;
    }
}

@end
</code></pre>

<p>我的两个问题是:
1. 为什么要调用 super.delegate 并且只将“delegate”声明为属性?
2. 为什么要拦截所有的委托(delegate)调用,然后将它们转发回委托(delegate)?</p>

<p>感谢任何见解。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>Apple 的文档明确指出您应该避免子类 <code>MKMapView</code>:</p>

<p> <a href="http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/doc/uid/TP40008205" rel="noreferrer noopener nofollow">http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/doc/uid/TP40008205</a> </p>

<blockquote>
<p>Although you should not subclass the MKMapView class itself, you can
get information about the map view’s behavior by providing a delegate
object.</p>
</blockquote>

<p>所以我猜这个委托(delegate)“前进”模式是用来不破坏事物的。</p>

<p>我对<code>MKMapView</code> 使用了一些不同的方法。为了尽量减少破损,我使用了两个类。一个子类 <code>MKMapView</code> 并且只是覆盖 init/dealloc 方法并将 <code>delegate</code> 属性分配/释放到另一个类的实例。另一个类是 <code>NSObject</code> 的子类,它实现了 <code>MKMapViewDelegate</code> 协议(protocol),将是真正的工作。</p>

<p>MyMapView.h</p>

<pre><code>@interface MyMapView : MKMapView
@end
</code></pre>

<p>MyMapView.m</p>

<pre><code>// private map delegate class
@interface MapDelegate : NSObject &lt;MKMapViewDelegate&gt;
// instance is not alive longer then MKMapView so use assign to also solve
// problem with circular retain
@property(nonatomic, assign) MKMapView *mapView;
@end

@implementation MapDelegate
@synthesize mapView;

- (id)initWithMapView:(ReportsMapView *)aMapView {
self = ;
if (self == nil) {
    return nil;
}

self.mapView = aMapView;

return self;
}

// MKMapViewDelegate methods and other stuff goes here

@end

@implementation MyMapView
- (id)init {
self = ;
if (self == nil) {
    return nil;
}

// delegate is a assign property
self.delegate = [ initWithMapView:self];

return self;
}

- (void)dealloc {
((MapDelegate *)self.delegate).mapView = nil;
;
self.delegate = nil;

;
}
@end
</code></pre>

<p><code>MapDelegate</code> 类的 <code>mapView</code> 属性不是严格需要的,但如果想要对 mapView 执行不是某些 <code 的结果的操作,则可能很有用>MKMapViewDelegate</code> 方法调用、定时器等</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - MKMapViewDelegate 派生类和委托(delegate)赋值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/7586961/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/7586961/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - MKMapViewDelegate 派生类和委托(delegate)赋值