Mapview не показывает аннотированную точку

Я пытаюсь построить точку на карте. Я создал два файла: 1. Файл, расширяющий nsobject, и 2. Файл, расширяющий представления. Вот исходный код для обоих файлов:

#import "gpMapViewAnnotations.h"

@implementation gpMapViewAnnotations
@synthesize title, coordinate;

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d {

    title = ttl;
    coordinate = c2d;
    return self;
}

это код для файла интерфейса.

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface gpMapViewAnnotations : NSObject <MKAnnotation>{

    NSString *title;
    CLLocationCoordinate2D coordinate;
}
@property (nonatomic, copy) NSString *title;
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d;


@end

@конец

Теперь это исходный код для просмотра файлов:

#import <UIKit/UIKit.h>
#import <MapKit/Mapkit.h>
#import "ASIHTTPRequestDelegate.h"
#import "AppDelegate.h"
#import "gpMapViewAnnotations.h"

@interface gpViewController : UIViewController
< ASIHTTPRequestDelegate, MKMapViewDelegate>
{
     MKMapView *gpMapView;


    gpMapViewAnnotations *gpAnnotations;

}
@property (strong, nonatomic) IBOutlet MKMapView *gpMapView;

@end

А вот и файл реализации:

#import "gpViewController.h"
#import "ASIHTTPRequest.h"
#import "Parser.h"
#import "AppDelegate.h"
#import "TFHpple.h"
#import "TouchXML.h"
#import "gpMapViewAnnotations.h"


@interface gpViewController ()

@end

@implementation gpViewController
@synthesize gpMapView;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {

    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    // Set some coordinates for our position (Buckingham Palace!)
    CLLocationCoordinate2D location;
    location.latitude = (double) 51.501468;
    location.longitude = (double) -0.141596;

    // Add the annotation to our map view
    gpMapViewAnnotations *newAnnotation = [[gpMapViewAnnotations alloc] initWithTitle:@"Buckingham Palace" andCoordinate:location];
    [gpMapView addAnnotation:newAnnotation];

    NSURL *url = [NSURL URLWithString:@"http://v1.syndication.nhschoices.nhs.uk/organisations/gppractices/location.xml?apikey=YAHUGHET&range=50&northing=174900&easting=517900&name=richmond"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

    [request setDelegate:self];

    [request startAsynchronous];
    [gpMapView setDelegate:self];

}

- (void)viewDidUnload
{
    [self setGpMapView:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}

- (void)requestFinished:(ASIHTTPRequest *)request
{
     NSLog(@"view did load");
    NSLog(@"request finished");
    // Use when fetching text data
    NSString *responseString = [request responseString];
//   NSLog(@"%@",responseString);
    // Use when fetching binary data

    NSData *responseData = [request responseData];

    //  we will put parsed data in an a array
    NSMutableArray *res = [[NSMutableArray alloc] init];
    //  using local resource file
   // NSString *XMLPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.xml"];
  //  NSData *XMLData   = [NSData dataWithContentsOfFile:responseString];
    CXMLDocument *doc = [[CXMLDocument alloc] initWithData:responseData options:0 error:nil];

    NSArray *nodes = NULL;
    //  searching for piglet nodes
    nodes = [doc nodesForXPath:@"//*" error:nil];
    NSLog(@"coming here 1");
    for (CXMLElement *node in nodes) {
        //NSLog(@"coming here 2");

      //  NSMutableArray *item = [[NSMutableArray alloc]init];
        //create list object to store the title and latitude and longitude.
        List *gpList = [[List alloc]init];

        if([[node localName] isEqualToString:@"entry"]){
            NSArray *entryTagNodes = [node children];

            //iterate on entry nodes
            for(CXMLElement *entryTagNode in entryTagNodes){
                //check if the tagname is content
                if([[entryTagNode localName] isEqualToString:@"content"]){
                        //iterat on content tag childs
                    NSArray *contentTagNodes = [entryTagNode children];
                    // NSLog(@"tag: %d",[contentTagNodes count]);
                    for(CXMLElement *innerContentNode in contentTagNodes){

                        NSArray *organisationTagNodes = [innerContentNode children];
                        for(CXMLElement *orgTagNode in organisationTagNodes){
                           // NSLog(@"%@",[orgTagNode localName]);

                                //check for tag name is equal to name
                            if([[orgTagNode localName] isEqualToString:@"name"]){
                                gpList.title = [orgTagNode stringValue];

                            }else if([[orgTagNode localName] isEqualToString:@"geographicCoordinates"]){
                                NSArray *geoCordTags = [orgTagNode children];

                                for(CXMLElement *geoCordTag in geoCordTags){
                                    if([[geoCordTag localName] isEqualToString:@"latitude"]){
                                        gpList.latitude = [geoCordTag stringValue];

                                    }else if([[geoCordTag localName] isEqualToString:@"longitude"]){
                                        gpList.longitude = [geoCordTag stringValue];
                                    }

                                }
                               NSLog(@"latitude nad longitude %@ %@",gpList.latitude,gpList.longitude);

                            }
                        }
                    }


                }

            }
            [res addObject:gpList];

        }

        //  and here it is - attributeForName! Simple as that.
      //  [item setObject:[[node valueForKey:@"id"] stringValue] forKey:@"id"];  // <------ this magical arrow is pointing to the area of interest



    }

    //  and we print our results
  //  NSLog(@"%@", res);
    NSEnumerator *enumerator = [res objectEnumerator];
    id obj;
    while(obj = [enumerator nextObject]){

            NSLog(@"title %@",[obj title]);

    }

    /*
    TFHpple *doc = [TFHpple hppleWithData:responseData isXML:YES];
    NSArray *elements = [doc searchWithXPathQuery:@"/"];

    NSLog(@"%d",[elements objectAtIndex:0]);
   */
    /*
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:responseData];
    Parser *parser = [[Parser alloc] initParser];

    [xmlParser setDelegate:parser];
    BOOL worked = [xmlParser parse];
    if(worked){
        NSLog(@"parsing is happening ");

    }else{
        NSLog(@"parsing is not happening %@",[app.listArray count]);
    }*/


}

-(void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *)views{
    MKAnnotationView *annotationView = [views objectAtIndex:0];
    id <MKAnnotation> mp = [annotationView annotation];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 1500, 1500);
    [mv setRegion:region animated:YES];
    [mv selectAnnotation:mp animated:YES];
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
    NSLog(@"%@",error);
}

@end

Я понятия не имею, где я ошибаюсь в построении простой точки. мне все еще нужно поставить несколько точек, используя массив, который я создал для чтения XML-файла. но даже простая точка сейчас не вычерчивается. Есть ли что-то, что я делаю неправильно здесь, пожалуйста?


person Maverick    schedule 30.04.2012    source источник


Ответы (1)


Я не вижу ваш метод делегата mapView:viewForAnnotation:. Здесь вы можете добавить представление, чтобы оно соответствовало аннотациям. Что-то вроде этого:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if( annotation == mapView.userLocation ) return nil;

    MKPinAnnotationView *annotationView;
    annotationView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"AnnotationIdentifier"];
    if( annotationView == nil ){
        annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"AnnotationIdentifier"];
    }

    return annotationView;
}
person nevan king    schedule 30.04.2012
comment
не могли бы вы объяснить код и части, которые мне нужно изменить для соответствия моему коду? - person Maverick; 30.04.2012
comment
Вам нужно будет добавить этот метод к вашему делегату mapview. - person nevan king; 30.04.2012
comment
Извините, я немного новичок в этом .. не могли бы вы объяснить, какой делегат? Я добавил в интерфейс протокол mkmapviewDelegate. - person Maverick; 30.04.2012
comment
Добавьте его в свой файл gpMapViewAnnotations.m, то есть файл MKMapviewDelegate. - person nevan king; 30.04.2012
comment
Я сделал это.. и это показывает мне Use of undeclared identifier 'delegate' - person Maverick; 30.04.2012
comment
Вы правильно установили делегата? - person nevan king; 01.05.2012
comment
Я установил [gpmapView setDelegate:self]; в viewdidload - person Maverick; 01.05.2012