0

因此,我创建了一个显示在所选注释上方的自定义标注。一切都按照我想要的方式工作——唯一的问题是在我放下另一个相同类型的引脚之后,所有过去的引脚都会显示相同的信息。例如,我可能有一个显示在标注“McDonalds”中的图钉掉落,而下一个掉落的图钉显示“Starbucks”。现在我之前丢弃的所有图钉都将显示“星巴克”。

我目前正在尝试将信息存储在注释的 subtitle 属性中,然后通过格式化的字符串将其显示到我的自定义 UIView 的标签上......它可以工作,但我需要注释的信息永远不会改变。一定有我遗漏或不明白的东西。任何帮助都感激不尽。

我已经在下面发布了我认为相关的所有代码。谢谢!

自定义标注.h

#import <UIKit/UIKit.h>

@interface PinView : UIView
{
    UIView *view;
    UILabel *theValueLabel;
}

@property (nonatomic, retain) IBOutlet UIView *view;
@property (nonatomic, retain) IBOutlet UILabel *theValueLabel;

@end

自定义标注.m

#import "PinView.h"

@implementation PinView
@synthesize theValueLabel;
@synthesize view;



- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        UIView *nib = [[[UINib nibWithNibName:@"customView" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0];
        [self addSubview:nib];
    }
    return self;
}


-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        if (self.subviews.count == 0) {
            UIView *nib = [[[UINib nibWithNibName:@"customView" bundle:nil] instantiateWithOwner:self options:nil] objectAtIndex:0];
            [self addSubview:nib];
        }
    }
    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    [self setup];
}

- (void)setup {
    self.theValueLabel.text = @"foo";
}

在我的主视图 Controller.m

@interface BreadTrailViewController ()<CLLocationManagerDelegate, MKMapViewDelegate, MFMailComposeViewControllerDelegate>
{
    PinView *aView

    MKPointAnnotation *Pin1;
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    CLLocation *location = [locations lastObject];

    if (location != nil)
    {
         Pin1 = [[MKPointAnnotation alloc] init];
         Pin1.title = @"Venue";
         Pin1.subtitle = [NSString stringWithFormat:@"Venue Name: %@\n%f,%f\nAddress: %@",revGeocodeVenue, lat, lng, revGeocodeAddress];
         Pin1.coordinate = location.coordinate;
         [self.mapView addAnnotation:Pin1];
    }
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    // If it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    // Handle any custom annotations.
    if ([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];

        if (!pinView)
        {
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];

            pinView.canShowCallout = NO;

        } else {

            pinView.annotation = annotation;
        }

        if ([[annotation title] containsString:@"Venue"])
        {
            pinView.pinTintColor = [UIColor greenColor];
        }

        return pinView;

    }
    return nil;

}

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    aView = [[PinView alloc] initWithFrame:CGRectMake( 0, 0, 300, 350)];

    aView.layer.cornerRadius = 20;
    aView.layer.masksToBounds = YES;
    aView.center = CGPointMake(view.bounds.size.width*0.5f, -aView.bounds.size.height*0.35f);

    //Using the Pin's subtitle to store the data string and display on PinView
    if ([[view.annotation title] containsString:@"Venue"])
    {
        aView.theValueLabel.text = Pin1.subtitle;
    }

    [view addSubview:aView];
}

-(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    [aView removeFromSuperview];
}
4

1 回答 1

0

我发现了问题!当我应该使用的是 view.annotation.subtitle 时,我正在使用 Pin1.subtitle——现在一切正常。我希望这对其他人有帮助!

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    aView = [[PinView alloc] initWithFrame:CGRectMake( 0, 0, 300, 350)];

    aView.layer.cornerRadius = 20;
    aView.layer.masksToBounds = YES;
    aView.center = CGPointMake(view.bounds.size.width*0.5f, -aView.bounds.size.height*0.35f);

    //Using the Pin's subtitle to store the data string and display on PinView
    if ([[view.annotation title] containsString:@"Venue"])
    {
        aView.theValueLabel.text = view.annotation.subtitle;
    }

    [view addSubview:aView];
}
于 2015-11-23T17:12:33.067 回答