Почему метод делегата MKMapView не вызывается? - PullRequest
0 голосов
/ 27 апреля 2011

Я очень новичок в разработке для iphone и пытаюсь комментировать карту. Мне удалось получить 3 точки местоположения на карте с жестко заданными координатами, и теперь я пытаюсь настроить контакты. Я знаю, что для этого вам нужно реализовать: -(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation { метод делегата.

По какой-то причине я не смог даже позвонить. Вот что у меня в заголовке контроллера:

#import "ArtPiece.h"
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface TestViewController : UIViewController <MKMapViewDelegate> {
    MKMapView *mapView;
    NSMutableArray *mapAnnotations;
    float results_lat[3];
    float results_long[3];
    NSMutableArray *results_title;
    NSMutableArray *Arts;

}
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic, retain) NSMutableArray *mapAnnotations;

@end

А вот что я имею в реализации контроллера:

- (void)viewDidLoad {
    results_long[0] = -122.477989;
    results_lat[0] = 37.810000;
    results_long[1] = -122.480000;
    results_lat[1] = 37.820000;
    results_long[2] = -122.4850000;
    results_lat[2] = 37.830000;

    self.mapAnnotations = [[NSMutableArray alloc] initWithCapacity:3];
    Arts = [[NSMutableArray alloc] initWithCapacity:3];
    for(int x = 0; x<3; x++)
    {
        // creates an ArtPiece object and sets its lat and long
        ArtPiece *a = [[ArtPiece alloc] init];
        a.longitude = [NSNumber numberWithDouble:results_long[x]];
        a.latitude = [NSNumber numberWithDouble:results_lat[x]];
        a.title = @"please show up";
        // add objects to annotation array
        [self.mapAnnotations insertObject:a atIndex:x];
        [a release];

    }
    // center screen on cali area
    [self gotoLocation];
    for(int x = 0; x<3; x++)
    {
        [mapView addAnnotations:mapAnnotations];
    }
}

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation {
    NSLog(@"This is not printing to to console...");
    MKPinAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) 
    {
        static NSString *defaultPinID = @"com.invasivecode.pin";
        pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
        if ( pinView == nil ) pinView = [[[MKPinAnnotationView alloc]
                                          initWithAnnotation:annotation reuseIdentifier:defaultPinID] autorelease];

        pinView.pinColor = MKPinAnnotationColorPurple; 
        pinView.canShowCallout = YES;
        pinView.animatesDrop = YES;
    } 
    else {
        [mapView.userLocation setTitle:@"I am here"];
    }
    return pinView;
}

А вот и реализация класса ArtPiece:

   #import "TestViewController.h"
    #import "ArtPiece.h"
    #import <MapKit/MapKit.h>
    #import <CoreData/CoreData.h>

    @implementation ArtPiece

    @synthesize title, artist, series, description, latitude, longitude;

    - (CLLocationCoordinate2D)coordinate
    {
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = [self.latitude doubleValue];
        theCoordinate.longitude = [self.longitude doubleValue];
        return theCoordinate;
    }



    @end

Возможно, это что-то простое. Что-то не так с моим объявлением метода? Я объявил делегата неправильно? Я не могу понять это, опять же, я очень новичок в этой цели с / делегата. Спасибо за любую помощь.

1 Ответ

3 голосов
/ 27 апреля 2011

Метод addAnnotations ожидает NSArray объектов, которые соответствуют протоколу MKAnnotation.

Вы добавляете объекты типа ArtPiece, которые, по-видимому, не реализуют MKAnnotation со свойством coordinate (не latitude и longitude свойствами).

Обновите класс ArtPiece, чтобы он соответствовал MKAnnotation (или используйте предопределенный класс MKPointAnnotation). Но обновление вашего пользовательского класса - лучшее решение.

...