gpt4 book ai didi

iOS - 当我将方法移动到另一个类时,MKMapView 覆盖不会呈现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:14:20 25 4
gpt4 key购买 nike

正在清理我的代码,以便我可以在 MKMapView 苹果 map 上渲染不同的轨迹叠加层,具体取决于...

目前我有一张苹果 map ,当我在我的 View Controller 类“ParkMapVC”中使用两种方法-addOverlayTo: 和 mapView:rendererForOverlay 时,我可以获得渲染的特定叠加轨迹图像(在 MKMapView 对象上)。当我将这两个方法移动到另一个更通用的类“ParkMapOverlay”(一个 NSObject 继承类)时,我可以获取我直接发送消息以执行的“addOverlayTo:”方法,但不是 mapView:rendererForOverlay 方法。

我没有在原始(工作)版本中直接向 mapView:rendererForOverlay 发送消息,但是从调试器来看,它似乎是由我的 addOverlayTo: 方法触发的——我认为是由返回的对象触发的——尽管我并不完全清楚或肯定这一点。

这个有效:

    //  ParkMapVC.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "ParkMap.h"
#import "ParkMapVC.h"
@interface ParkMapVC : UIViewController <MKMapViewDelegate>{
}
@property (strong, nonatomic) IBOutlet MKMapView *hikeMap;
@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic, strong) ParkMap *park;
+ (ParkMapVC *) sharedParkMapVC;
- (void)addOverlayTo :(ParkMap*) thePark;
@end
#import "ParkMapVC.h"
#import "ParkMap.h"
#import "ParkMapOverlay.h"
#import "ParkMapOverlayView.h"
@interface ParkMapVC ()
@end
//*************
@implementation ParkMapVC
+ (ParkMapVC *) sharedParkMapVC {
static ParkMapVC *sharedParkMapVC;
@synchronized (self) {
if (!sharedParkMapVC) {
sharedParkMapVC = [[ParkMapVC alloc] init ];

}
return sharedParkMapVC;
}

}
- (void)viewDidLoad
{
[super viewDidLoad];
self.park = [[ParkMap alloc] initWithFilename:@"EdgewoodVer2"]; // plist
// define region for apple map
self.mapView.region = [self.park defineMapRegion:self.park];
[self addOverlayTo:_park];
}
#pragma mark - Add methods
- (void)addOverlayTo :(ParkMap*) thePark{
ParkMapOverlay *overlay = [[ParkMapOverlay alloc]
initWithPark:self.park];
[self.mapView addOverlay:overlay];
}
#pragma mark - Map View delegate
// This should go to ParkMapOverlay 8.5.15
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {

UIImage *overlayEdgewoodImage = [UIImage
imageNamed:@"EDGEoverlay_park_Cropped"];

ParkMapOverlayView *overlayView = [[ParkMapOverlayView alloc] initWithOverlay:overlay overlayImage:overlayEdgewoodImage];

return overlayView;

}

@end

什么不起作用:

此时 - 我将这两个方法 - addOverlayTo: 和 mapView:rendererForOverlay- 移到了“ParkMapOverlay”类中。我改变了发送消息 addOverlayTo 的方式,它从“ParkMapOverlay”类中执行。但是,根据调试器断点,我可以看到 ma​​pView:rendererForOverlay 方法未收到消息,而且确实未呈现叠加层。我只看到我的苹果 map 显示在 View 中。

代码如下: //在 ParkMapVC 中,我更改了覆盖以向新类 ParkMapOverlay 发送消息

  [super viewDidLoad];
self.park = [[ParkMap alloc] initWithFilename:@"EdgewoodVer2"];
ParkMapOverlay *theOverlay = [[ParkMapOverlay alloc]init];

self.mapView.region = [self.park defineMapRegion:self.park];
self.mapView = [theOverlay addOverlayTo:_park ];

// Then I commented out the original two methods, moving the code to ParkMapOverlay

// ParkMapOverlay.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@class ParkMap;
@interface ParkMapOverlay : NSObject <MKOverlay, MKMapViewDelegate>
- (instancetype)initWithPark:(ParkMap *)park;
- (MKMapView *)addOverlayTo :(ParkMap*) thePark;
@end

// ParkMapOverlay.m
#import "ParkMapOverlay.h"
#import "ParkMapOverlayView.h"
#import "ParkMap.h"
@implementation ParkMapOverlay
@synthesize coordinate;
@synthesize boundingMapRect;
- (instancetype)initWithPark:(ParkMap *)park {
self = [super init];
if (self) {
boundingMapRect = park.overlayBoundingMapRect;
coordinate = park.midCoordinate;
}

return self;
}
- (MKMapView *)addOverlayTo :(ParkMap*) thePark
{
ParkMapOverlay *overlay = [[ParkMapOverlay alloc] initWithPark:thePark];
MKMapView *mapView = [[MKMapView alloc] init];
[mapView addOverlay:overlay];

return mapView;

}
#pragma mark - Map View delegate


- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
UIImage *overlayEdgewoodImage = [UIImage
imageNamed:@"EDGEoverlay_park_Cropped"];

ParkMapOverlayView *overlayView = [[ParkMapOverlayView alloc] initWithOverlay:overlay overlayImage:overlayEdgewoodImage];

return overlayView;

}
@end

我想知道的是-

  1. 这些方法最初在 ViewController 类中,现在它们在 NSObject 子类中
  2. 因为我不完全理解 MKOverlayRenderer 最初是如何被调用的,所以我需要了解一些事情,现在必须完成才能触发它
  3. 关于我现在在 ParkMapVC 的 viewDidLoad 方法中向 addOverlayTo: 方法发送消息的方式让我感到困惑
  4. 我在 Xamarin 中的“将叠加层添加到 map ”一节中找到了一个引用,它说“在将 MKOverlay 添加到 MkMapView 之前必须分配 OverlayRenderer 方法”。我不确定这意味着什么 - 除非它与我在向 addOverlayTo: 方法发送消息之前分配初始化的对象有关?

谢谢。远程接收系统

最佳答案

mapView:rendererForOverlay:<MKMapViewDelegate> 的一种方法协议(protocol)。

在你的新addOverlayTo:您正在初始化新 MKMapView 对象但未将 ParkMapOverlay 对象设置为该 map View 的委托(delegate)的方法。这就是为什么 mapView:rendererForOverlay:不被调用。

尝试将其设置为 mapView.delegate = self .

还要注意内存管理:MKMapView 的 delegate是一个弱属性,即它不保留其委托(delegate),因此您必须确保保留您的 ParkMapOverlay 对象。

当前保留应该正确发生,因为您同时具有覆盖功能和 mapView:rendererForOverlay:一个类中的方法,以便通过 -[MKMapView addOverlay:] 添加该类作为覆盖确保保留该对象,但这是您设计的副作用,因此请注意这一点。

关于iOS - 当我将方法移动到另一个类时,MKMapView 覆盖不会呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31841631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com